【发布时间】:2019-01-03 05:09:49
【问题描述】:
我有这个代码
List<int> items = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
//calculation is not being executed until "even" is used
IEnumerable<int> even = items.Where(x => x % 2 == 0);
DoStuff1(even);
DoStuff2(even);
DoStuff3(even);
我已阅读此答案https://stackoverflow.com/a/3628705/6887468 它说
当您使用 IEnumerable 时,您可以让编译器有机会将工作推迟到以后进行,可能会在此过程中进行优化。如果您使用 ToList(),您会强制编译器立即具体化结果。
现在是在每次调用DoStuff() 时执行此计算(在我的示例中为x % 2 == 0)还是以某种方式保存在内存中?
【问题讨论】:
-
这取决于
DoStuff的代码! -
假设您在 where.
IEnumerable<int> even = items.Where(x => x % 2 == 0);beneath it items.Add(10) 之后添加一个项目。它仍将计入您的DoStuff,因为 even 仍未评估。 -
如果
DoStuffx迭代even参数,那么x % 2 == 0将在内部 执行每个DoStuffx方法。如果您在调用方法之前使用了ToList,那么x % 2 == 0将在原始List中的每个元素中仅出现一次(在任何DoStuffx调用之前)。
标签: c# linq ienumerable enumerable