Archief - [PROG]C# ArrayList.BinarySearch(object,ICompare) vraag

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

GrAmLin

Legacy Member
Hallo mensjes,

Ik zit met een raar probleem.

Ik heb een Arraylist waar er data inzit. (al sorted) maar ik wil dan in die data gaan zoeken. Hier in het voorbeeld zitten er nummers in.

Dit is m'n code,


object waardeObj;
int plaats;
waardeObj = 4;
myVgl = new Persoon.cmpNr();
plaats = Klanten.BinarySearch(waardeObj, myVgl);



in mijn klasse "persoon" heb ik

public class cmpNr:IComparer
{
int IComparer.Compare(object o1, object o2)
{
return ((Persoon)o1).persoonsNr - ((Persoon)o2).persoonsNr;
}
}

}


Ik krijg altijd een uitzonderingsfout van IComparer te zien. Weet iemand wat het probleem kan zijN?

vriendelijke groeten

Kn0t

Legacy Member
Je zegt de er nummers in de lijst zitten, en geen Personen? Je comparer vergelijkt Persoon objecten.

GrAmLin

Legacy Member
Hallo,

Bedankt voor uw reactie!

Ik heb m'n 2 bestanden gepost op internet in TXT vorm.

http://www.designersart.be/Form1.txt
http://www.designersart.be/Persoon.txt

Ik zie echt niet wat m'n fout is. Ik krijg telkens de fout op m'n icomparer voor het gaan zoeken.

Dus voor ik BinarySearch doe ga ik em eerst gaan sorteren aande hand van


Klanten.Sort(new Persoon.cmpNr());
waardeObj = txtKlantennummer.Text;
myVgl = new Persoon.cmpNr();
plaats = Klanten.BinarySearch(waardeObj,myVgl);


dan krijg ik een error "De opgegeven Icomparer heeft een uitzondering veroorzaakt."

Ik zit nu al 5 uur aan het zoeken op dit "denk ik wel belachelijk probleem".

Met vriendelijke groeten!

Tyfius

Legacy Member
Ik zie niet meteen iets fout, maar ik vraag me alleen af.
Je declareert variabelen (bvb postcode) zonder private of public, voorziet een getter ervoor maar in de functie in de andere klassen ga je rechtstreeks de variabele oproepen. Lijkt me wat onlogisch.

Kn0t

Legacy Member
waardeObj is een String dus dat zal ook niet lukken. Je zal de lijst zelf moeten overlopen.

.Acku.

Legacy Member
Inderdaad. Verbaast me hoeveel C# op Java trekt, de code is volledig hetzelfde dankzij de API. Ken geen kloot van C# maar begrijp ze perfect.

Aetemon

Legacy Member
GrAmLin zei:
Ik krijg altijd een uitzonderingsfout van IComparer te zien. Weet iemand wat het probleem kan zijN?
Misschien bestaat het object waarvoor gezocht wordt niet?

Anyway, zelf nog nooit BinarySearch gebruikt hier.
Ik doe gewoonlijk iets in deze stijl:
Code:
int i;
for (i = 0; i < Klanten.Count && ((Persoon)Klanten[i]).Nr != ZOEKNR; i++) { }
if (i < Klanten.Count) MessageBox.Show("Index: " + i);
else MessageBox.Show("Niet Gevonden");
of
Code:
int i;
for (i = 0; i < Klanten.Count && ((Persoon)Klanten[i]).FamilieNaam != ZOEKNAAM; i++) { }
if (i < Klanten.Count) MessageBox.Show("Index: " + i);
else MessageBox.Show("Niet Gevonden");
of
Code:
public Persoon SearchKlant(int nummer)
{
foreach (Persoon KLANT in Klanten)
{
if (KLANT.Nr == nummer) return KLANT;
}
// return new Persoon();
// return null;
throw new Exception("Persoon niet gevonden.");
}

.Acku.

Legacy Member
Dat is een erg ineffectieve manier om te zoeken (alhoewel de eerste niet veel beter is als de gesorteerde lijst niet verder gebruikt wordt).
Het ligt gewoon aan het feit dat het een string is ipv een nummer

Aetemon

Legacy Member
GrAmLin zei:
Klanten.Sort(new Persoon.cmpNr());
waardeObj = txtKlantennummer.Text;
myVgl = new Persoon.cmpNr();
plaats = Klanten.BinarySearch(waardeObj,myVgl);

dan krijg ik een error "De opgegeven Icomparer heeft een uitzondering veroorzaakt."
Ahja, probeer anders eens:
waardeObj = Convert.ToInt32(txtKlantennummer.Text, 10); :D
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan