Linq表达式和foreach产生不同的结果

时间:2013-08-14 11:11:13

标签: c# linq

请您解释为什么这两个函数的输出对于相同的数据是不同的?
我希望它们产生相同的输出,即附加线。如何更改备选1以添加行?

(后台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)));
}

- &GT;没有输出/添加行

备选方案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));
    }
}

- &GT;为每次测量添加行

1 个答案:

答案 0 :(得分: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)));
}