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延迟执行,因此永远不会执行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)));
}