c#是先连接列表然后过滤还是先过滤再连接更快?

本文关键字:过滤 连接 然后 列表 | 更新日期: 2023-09-27 18:06:37

假设我有3个列表(在我的例子中不超过10个)。

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

可能有副本。我需要找到匹配请求的前10个不同元素(我知道如何做到这一点,这不是问题)。

  1. 连接3个列表然后过滤是否更快?
  2. 还是过滤3个列表(3x10个元素)然后连接更快?然后再次筛选最后10个我想要的元素。

我会选择第二个选项,但我不是100%,因为我不知道串联的成本和过滤的成本。

谢谢你的建议。

编辑:

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

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

c#是先连接列表然后过滤还是先过滤再连接更快?

编辑回答:我之前有一个想法,因为出于某种原因,我认为"连接"实际上是创建一个完整的新列表。(实际上,我知道部分原因,因为我想到了连接字符串的成本,但我不知道为什么会这样)。

当然,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>的情况进行优化的,只有后者从幕后的优化中受益。

因为我还没有50个声誉,所以我不能使用评论。对不起家伙。

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

所以你连接3个列表,然后通过这个大列表过滤。2操作。

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