2013-08-14 2 views
5

Не могли бы вы объяснить, почему вывод этих двух функций различен для одних и тех же данных?
Я ожидал, что они будут производить тот же вывод, то есть добавить строки. Как изменить альтернативу 1 для добавления строк?Выражение Linq и foreach производят разные результаты

(Фон Measurements реализует ICollection<>)

Альтернативные 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))); 
} 

-/добавлены линии> отсутствие выходных

Вариант 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)); 
    } 
} 

-> добавлены линии для каждого измерения

ответ

9

Поскольку linq задерживает выполнение, поэтому выполнение выбора никогда не произойдет (поскольку вы делаете выбор и затем выходите из метода), тогда как 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 Evaluation - это термин. [Статья о 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

Смежные вопросы