哪个LINQ查询更有效?

时间:2010-05-06 02:49:53

标签: c# linq

我有一个巨大的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);

他们中的一个总是比另一个好吗?还是其他任何好的建议?提前谢谢。

7 个答案:

答案 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()会比最后调用它时产生更大的性能影响。虽然,正如我之前的其他人所说,

  1. 为什么要使用ToArray()Array.ForEach()
  2. 我们不知道其他所有内容实际上是相同的,因为您没有透露过滤器和操作的实现细节。

答案 5 :(得分:0)

LINQ的想法是处理可枚举的集合,因此最好的LINQ查询是您根本不使用Array.ForEach().ToArray()的查询。

答案 6 :(得分:-1)

我会说这属于过早优化的范畴。如果在建立基准测试后,您发现代码太慢,您可以随时尝试每种方法并选择有效的结果对你更好。

由于我们不知道IEnumerable<>是如何产生的,因此很难说哪种方法会表现得更好。我们也不知道在应用谓词后还剩下多少项 - 我们也不知道动作或迭代步骤是否会成为执行代码的主要因素。确切知道的唯一方法是两种方式尝试,分析结果,并选择最佳。

除了性能之外,我会选择最清晰的版本 - 对我来说首先要过滤,然后将投影应用到结果中。