Min kode opfører sig ikke som forventet...

Published 08 August 08 09:42 AM

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

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# car insurance » Min kode opf??rer sig ikke som forventet… said on August 8, 2008 6:29 AM:

PingBack from http://hoursfunnywallpaper.cn/?p=302

# Jesper Blad Jensen said on August 8, 2008 7:47 AM:

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.

# Jesper Blad Jensen said on August 8, 2008 7:49 AM:

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

# danielmf said on August 8, 2008 7:52 AM:

Jesper, desværre er det ikke korrekt.

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

# anonym said on August 9, 2008 5:48 AM:

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

# Jakob Andersen said on August 9, 2008 11:01 AM:

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

# Jakob Andersen said on August 9, 2008 11:54 AM:

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

listOfCustomers = listOfCustomers.FindAll(

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

# danielmf said on August 10, 2008 8:04 AM:

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

# danielmf said on August 10, 2008 8:04 AM:

jakob, god forklaring! tak...

Leave a Comment

(required) 
(optional)
(required) 

  
Enter Code Here: Required

This Blog

Syndication

Page view tracker