2013-08-14 14 views
5

Könnten Sie bitte erklären, warum die Ausgabe dieser beiden Funktionen für die gleichen Daten unterschiedlich ist?
Ich erwartete, dass sie den gleichen Ausgang produzieren, d. H. Append Linien. Wie kann ich die Alternative 1 ändern, um Zeilen hinzuzufügen?Linq Ausdruck und foreach produzieren unterschiedliche Ergebnisse

(Background Measurements implementiert ICollection<>)

Alternative 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))); 
} 

-> keine Ausgabe/hinzugefügt Linien

Alternative 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)); 
    } 
} 

-> hinzugefügt Linien für jede Messung

Antwort

9

Da linq die Ausführung verzögert, wird die Auswahl nie ausgeführt (da Sie die Methode auswählen und dann beenden), während die foreach die Ausführung genau zum Zeitpunkt der Ausführung der Methode ausführt. Sie müssen das Ergebnis, das Sie auswählen, aufzählen. Zum Beispiel, indem Sie eine ToList() oder eine ToArray() ausführen, um die Methode zum Aufzählen zu zwingen, oder Sie könnten einen anderen Ansatz wählen.

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 Evaluation ist der Begriff. [Artikel über 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

Verwandte Themen