5

你能解释一下为什么这两个函数的输出对于相同的数据是不同的吗?
我希望它们产生相同的输出,即附加行。如何更改替代 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)));
}

-> 没有输出/添加的行

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

-> 为每个测量添加行

4

1 回答 1

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)));
}
于 2013-08-14T11:13:52.347 回答