我们说,我有3个列表(在我的情况下不超过10个)。
List 1 has m elements
List 2 has n elements
List 3 has p elements
可能有重复。我需要找到与请求匹配的10个第一个不同的元素(我知道如何做到这不是问题)。
我会选择第二种选择,但我不是100%,因为我不知道连接的成本和过滤的成本。
感谢您的任何意见。
修改 我最多可以有10个100-1000个元素的列表=>合并列表中1000个元素到10000个元素之间。
在我的情况下,这个请求可以每个用户每秒进行3到5次(但只是偶尔一次)。列表包含联系人,有时用户搜索联系人。我有一个ajax请求,它发送每个字符并刷新一个表。
答案 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个列表中搜索有什么区别?