2013-08-14 19 views
5

Proszę wyjaśnić, dlaczego dane wyjściowe tych dwóch funkcji są różne dla tych samych danych?
Spodziewałem się, że wytworzą takie same wyniki, tj. Dołączają linie. Jak mogę zmienić opcję 1, aby dodać linie?Wyrażenie Linq i foreach dają różne wyniki.

(Tło Measurements realizuje ICollection<>)

Alternatywne 1

private void CreateBody(TestRun testRun, StringBuilder lines) 
{ 
    testRun.Measurements.OrderBy(m => m.TimeStamp) 
     .Select(m => lines.AppendLine(string.Format("{0},{1}", m.TestRound, m.Transponder.Epc))); 
} 

-> no/wyjście Dodane linie

Alternatywa 2

private void CreateBody2(TestRun testRun, StringBuilder lines) 
{ 
    foreach (Measurement m in testRun.Measurements.OrderBy(m => m.TimeStamp)) 
    { 
     lines.AppendLine(string.Format("{0},{1}", m.TestRound, m.Transponder.Epc)); 
    } 
} 

-> Dodane linie na każdym pomiarze

Odpowiedz

9

Ponieważ polecenie linq opóźnia wykonanie, wykonanie selekcji nigdy się nie powiedzie (ponieważ robisz zaznaczenie, a następnie wychodzisz z metody), podczas gdy foreach wykona poprawnie wykonanie w momencie wykonywania metody. Musisz wyliczyć wynik, który wybierasz. Na przykład wykonując ToList() lub ToArray(), aby wymusić metodę wyliczenia, lub możesz przyjąć zupełnie inne podejście.

private void CreateBody(TestRun testRun, StringBuilder lines) 
{ 
    testRun.Measurements.OrderBy(m => m.TimeStamp).ToList().ForEach(m => lines.AppendLine(string.Format("{0},{1}", m.TestRound, m.Transponder.Epc))); 
} 
+0

Lazy Ewaluacja to termin. [Artykuł o Lazy vs Eager] (http://blogs.msdn.com/b/ericwhite/archive/2006/10/04/lazy-evaluation-_2800_and-in-contrast_2c00_-eager-evaluation_2900_.aspx) – bland

Powiązane problemy