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