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 (9)
  1. 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.

  2. Rettelse, den crasher når den finde et navn som ikke starter med E. Så ikke lige den ! der 😀

  3. Garry Trinder says:

    Jesper, desværre er det ikke korrekt.

    Koden køre skam fint, men hvordan ser min collection ud efterfølgende ?

  4. anonym says:

    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

  5. 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

  6. Nå ja, og det åbenlyse spørgsmål. Hvorfor bruger du ikke FindAll ?

    listOfCustomers = listOfCustomers.FindAll(

                   customer => !customer.fullName.StartsWith("E", StringComparison.CurrentCulture));

  7. Garry Trinder says:

    Fjerner jeg ! fra min if sætning vil den faktisk finde det jeg leder efter.

  8. Garry Trinder says:

    jakob, god forklaring! tak…

Comments are closed.

Skip to main content