c#连接列表然后过滤或过滤然后连接更快

时间:2015-08-06 13:36:48

标签: c# performance linq

我们说,我有3个列表(在我的情况下不超过10个)。

List 1 has m elements
List 2 has n elements
List 3 has p elements

可能有重复。我需要找到与请求匹配的10个第一个不同的元素(我知道如何做到这不是问题)。

  1. 连接3个列表然后过滤会更快吗?
  2. 或者更快地过滤3个列表(3x10个元素)然后连接。然后再次过滤以获得我想要的最后10个元素。
  3. 我会选择第二种选择,但我不是100%,因为我不知道连接的成本和过滤的成本。

    感谢您的任何意见。

    修改 我最多可以有10个100-1000个元素的列表=>合并列表中1000个元素到10000个元素之间。

    在我的情况下,这个请求可以每个用户每秒进行3到5次(但只是偶尔一次)。列表包含联系人,有时用户搜索联系人。我有一个ajax请求,它发送每个字符并刷新一个表。

2 个答案:

答案 0 :(得分:5)

编辑答案:我以前有一个thinko,因为出于某种原因,我认为“连接”实际上是在创建一个全新的列表。 (实际上,我知道原因的部分原因在于脑海中出现连接字符串的成本,但为什么会出现这种情况我不知道。)

当然,Linq中的连接没有这样的东西,所以选择在:

之间
list1.Concat(list2).Concat(list3) // ...and so on
  .Where(yourFilter)
  .Distinct()
  .Take(10)

list1.Where(yourFilter)
  .Concat(list2.Where(yourFilter))
  .Concat(list3.Where(yourFilter))
  .Distinct()
  .Take(10)

它们之间的区别非常有趣。

从这里看代码,我们不会期望会有太大差异。我们期望后者有一个缺点,因为它涉及更多的调用,但前者的缺点是Where实现中涉及的更多接口步骤比Concat更复杂。实施,所以这两个平衡。后者的出现速度略快,但取决于是否使用了第二个和/或第三个Where(如果Take在满足它们之前可能不满意的话,则可能不会这样。)

以列表作为源,但后者的速度要快得多,因为Where针对源为List<T>的情况进行了优化,只有后者才能从后面获得优化场景。

答案 1 :(得分:2)

因为我没有50个声誉但我不能使用评论。对不起老兄。

但是,对于这个问题。 在第一种情况下,您将分配一个与3个列表一样大的列表。 如果你有内存限制,这可能是一个坏主意。

所以你连续3个列表,然后筛选这个大清单。 2次操作。

在第二种情况下,您只需检测3个列表中的不同元素,访问不会花费那么多。 我的意思是,在3个列表或1个列表中搜索有什么区别?

相关问题