Min kode opfører sig ikke som forventet...
...men gør den nogensinde det ?
Jeg sidder med noget kode her som jeg synes opfører sig mere end underligt.
Hvad tror i det her kode gør ?
listOfCustomers.ForEach( delegate( MyService.Customer customer ) {
if(! customer.fullName.StartsWith( "E", StringComparison.CurrentCulture ) ) {
listOfCustomers.Remove( customer );
}
} );
God fornøjelse...
Comments
Anonymous
August 07, 2008
PingBack from http://hoursfunnywallpaper.cn/?p=302Anonymous
August 07, 2008
Jeg vil mene du får en felj, fordi du ikke kan slette når du er i en foreach løkke, så den vil køre endtil den finder noget der starter med E, og så crasher den.Anonymous
August 07, 2008
Rettelse, den crasher når den finde et navn som ikke starter med E. Så ikke lige den ! der :DAnonymous
August 07, 2008
Jesper, desværre er det ikke korrekt. Koden køre skam fint, men hvordan ser min collection ud efterfølgende ?Anonymous
August 08, 2008
Kan det være... Listen ser ud som inden koden blev kørt, da din delegate får dine customers som en ny reference til det samme objekt, som vi er nået til i listens iteration og når du så prøver at fjerne det fra din oprindelige liste, kan den ikke finde en tilsvarende reference i listOfCustomersAnonymous
August 09, 2008
Implementationen af Foreach(Action<T> act) er sikkert noget ala: void Foreach(Action<T> act){ for(int i = 0; i < this.Count; i++){ act(this[i]); } } I det øjeblik du fjerner et element fra collectionen hopper den interne counter i Foreach implementationen (i i ovenstående) ud af "sync". Et eksempel ville være hvis du har en liste der ser sådan her ud: Eva,John,James Første iteration: Eva <- i = 0 John James Anden iteration Eva John <- i= 1 James Tredje iteration: Eva James <- i = 2 Ergo stopper gennemløbningen fordi tælleren ikke længere er mindre end størrelsen på din collection og rent faktisk er vores "James" element aldrig blevet evalueretAnonymous
August 09, 2008
Nå ja, og det åbenlyse spørgsmål. Hvorfor bruger du ikke FindAll ? listOfCustomers = listOfCustomers.FindAll( customer => !customer.fullName.StartsWith("E", StringComparison.CurrentCulture));Anonymous
August 10, 2008
Fjerner jeg ! fra min if sætning vil den faktisk finde det jeg leder efter.Anonymous
August 10, 2008
jakob, god forklaring! tak...