C# c连接列表然后过滤,还是过滤然后连接更快

C# c连接列表然后过滤,还是过滤然后连接更快,c#,performance,linq,C#,Performance,Linq,比如说,在我的例子中,我有3个列表,不超过10个 List 1 has m elements List 2 has n elements List 3 has p elements 有可能有重复的。我需要找到匹配请求的前10个不同元素,我知道如何做,这不是问题所在 连接3个列表然后过滤是否更快? 或者,过滤3个列表3x10个元素,然后进行连接会更快吗。然后再次过滤,得到我想要的最后10个元素。 我会选择第二个选项,但我不是100%,因为我不知道串联的成本和过滤的成本 谢谢你的意见 编辑: 在合

比如说,在我的例子中,我有3个列表,不超过10个

List 1 has m elements
List 2 has n elements
List 3 has p elements
有可能有重复的。我需要找到匹配请求的前10个不同元素,我知道如何做,这不是问题所在

连接3个列表然后过滤是否更快? 或者,过滤3个列表3x10个元素,然后进行连接会更快吗。然后再次过滤,得到我想要的最后10个元素。 我会选择第二个选项,但我不是100%,因为我不知道串联的成本和过滤的成本

谢谢你的意见

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


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

因为我没有50个声誉,但我不能使用注释。对不起,伙计们

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

因此,你可以归纳出3个列表,然后过滤掉这个大列表。2.业务

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

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

当然,Linq中的连接没有这样的功能,因此可以选择:

list1.Concat(list2).Concat(list3) // ...and so on
  .Where(yourFilter)
  .Distinct()
  .Take(10)
以及:

它们之间的区别很有趣

从这里的代码来看,我们不希望有太大的区别。我们认为后者有一个缺点,因为它涉及的调用稍微多一些,但前者的缺点是Where实现中涉及的接口步骤比Concat实现更复杂,因此这两个步骤是平衡的。后者的速度稍微快一些,但这在多大程度上取决于第二个和/或第三个位置是否使用过,如果在击中它们之前拍得满意,它们可能不会使用


虽然以列表作为源,但后者的速度要快得多,因为对于源是列表的情况,Where进行了优化,只有后者从幕后的优化中受益。

Do List1.Distinct;清单2.不同;清单3.不同;要从3个列表中获得不同的元素,我可以在合并列表中有重复项,而不是在列表中。发布此消息时没有人注意到:我认为他发布此问题没有问题。虽然这个问题的结构显然更好,但他问为什么不仅仅是这样。它们本质上都是关于性能的。@Adam你是认真的吗?这个问题就是为什么有些东西更快。OP想知道背后的原因。@Adam:这个问题的问题是唯一正确的答案是“取决于”。没有足够的信息,并且有太多的变量可能会影响结果。可能会将此问题放在编辑通知下的问题中。你在谈论哪个问题?啊,对不起。一定是阅读障碍:我以为你问这个问题是出于某种原因。没关系,可能是因为迈克尔。你有麻烦了!有趣的是,如果问题集足够大,OP的选项2似乎更快。下面是我是否正确操作的证据:。无论如何,OP的问题集是如此之小的30个元素,以至于没有真正的性能差异,而且最好花时间让代码可读。谢谢你的回答。我在问题中添加了一些细节。
list1.Where(yourFilter)
  .Concat(list2.Where(yourFilter))
  .Concat(list3.Where(yourFilter))
  .Distinct()
  .Take(10)