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

本文关键字:结果 表达式 foreach Linq | 更新日期: 2023-09-27 18:27:41

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

->为每个测量添加行

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

由于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)));
}