我有一个巨大的IEnumerable(假设名字是myItems),哪种方式更有效?
解决方案1:首先过滤它然后过滤ForEach。
Array.ForEach(myItems.Where(FILTER-IT-HERE).ToArray(),MY-ACTION);
解决方案2:如果物品不符合芥末,请在MY-ACTION中返回。
Array.ForEach(myItems.ToArray(),MY-ACTION-WITH-FILTER);
他们中的一个总是比另一个好吗?还是其他任何好的建议?提前谢谢。
答案 0 :(得分:1)
你做过任何测量吗?由于WE无法测量My-Action的运行时间,因此只有您可以。衡量并决定。
答案 1 :(得分:1)
有时必须创建基准,因为类似的活动可能会产生完全不同的意外结果。
你没有说你的数据源是什么,所以我假设它可能是SQL服务器上的数据,在这种情况下,服务器端的过滤可能总是最好的方法,因为你已经最小化了数据量传递。内存访问总是比从磁盘到内存的数据传输更快,因此每当您可以传输更少的记录时,您可能会有更好的性能。
答案 2 :(得分:0)
好吧,两次,你都转换成一个数组,如果IEnumerable非常大(如你所说),这可能效率不高。您可以为IEnumerable创建一个通用扩展方法,例如:
public static void ForEach<T>(this IEnumerable<T> current, Action<T> action) {
foreach (var i in current) {
action(i);
}
}
然后你可以这样做:
IEnumerable<int> ints = new List<int>();
ints.Where(i => i == 5).ForEach(i => Console.WriteLine(i));
答案 3 :(得分:0)
如果表现是一个问题,我不清楚你为什么要首先构建整个阵列。为什么不呢?
foreach (var item in myItems.Where(FILTER-IT-HERE))
MY-ACTION;
或者:
foreach (var item in myItems)
MY-ACTION-WITH-FILTER;
我问,因为虽然其他人是正确的,但如果没有测试你就无法真正知道,我不希望上述两个选项之间存在太大差异。另一方面,我希望期望在创建/填充数组(看似无理由)和不创建数组之间存在差异。
答案 4 :(得分:0)
在其他条件相同的情况下,首先调用ToArray()
会比最后调用它时产生更大的性能影响。虽然,正如我之前的其他人所说,
ToArray()
和Array.ForEach()
?答案 5 :(得分:0)
LINQ的想法是处理可枚举的集合,因此最好的LINQ查询是您根本不使用Array.ForEach()
和.ToArray()
的查询。
答案 6 :(得分:-1)
我会说这属于过早优化的范畴。如果在建立基准测试后,您发现代码太慢,您可以随时尝试每种方法并选择有效的结果对你更好。
由于我们不知道IEnumerable<>
是如何产生的,因此很难说哪种方法会表现得更好。我们也不知道在应用谓词后还剩下多少项 - 我们也不知道动作或迭代步骤是否会成为执行代码的主要因素。确切知道的唯一方法是两种方式尝试,分析结果,并选择最佳。
除了性能之外,我会选择最清晰的版本 - 对我来说首先要过滤,然后将投影应用到结果中。