Delen via


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=302

  • Anonymous
    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 :D

  • Anonymous
    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 listOfCustomers

  • Anonymous
    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 evalueret

  • Anonymous
    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...