C# 哪个LINQ查询更有效?

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); 其中一个总是比另一个好吗?还是其他好的建议?提前谢谢。您做过测量吗?

我有一个巨大的IEnumerable(假设名称是myItems),哪种方法更有效

解决方案1:先过滤,然后再过滤

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;