2013-08-14 18 views
5

なぜ、これら2つの関数の出力が同じデータに対して異なるのか説明してください。
私は同じ出力、つまり行を追加することを期待しました。行を追加するには、代替1をどのように変更できますか?各測定のために>追加された行 -Linq式とforeachは異なる結果を生成します

代替>なし出力/追加された行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)); 
    } 
} 

-

代替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))); 
} 

(背景MeasurementsICollection<>を実装します)

答えて

9

linqは実行を遅らせるので、selectを実行してからメソッドを終了するため、selectは実行されませんが、foreachはメソッドを実行する時点で実行を行います。選択している結果を列挙する必要があります。たとえば、ToList()またはToArray()を実行してメソッドを列挙するか、別の方法を使用します。

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 vs Eagerの記事](http://blogs.msdn.com/b/ericwhite/archive/2006/10/04/lazy-evaluation-_2800_and-in-contrast_2c00_-eager-evaluation_2900_.aspx) – bland

関連する問題