两个大列表的快速联合

Fast union of two big lists

我在两个大列表(超过 100 万个条目)上使用 union,它很慢(几分钟) 我需要删除重复项的功能,所以我不能使用 concat 并且我的列表没有排序。 有没有更快的方法?也许使用 plinq?

你不是说列表中的项目是什么,但一种选择是为此任务使用适当的数据结构 - 你只想保留唯一的项目 - 这是 SET 的定义,所以使用 HashSet。

var hashSet = new HashSet<int>(list1);
hashSet.UnionWith(list2);

我还测量了上面代码与 Linq.Union:

的时间
var list3 = list1.Union(list2).Distinct();

这是时间安排(HashSet.UnionWith 工作速度几乎快两倍):

HashSet.UnionWith
real    0m4.111s
user    0m3.890s
sys 0m0.132s

real    0m4.562s
user    0m4.074s
sys 0m0.170s

real    0m4.052s
user    0m3.851s
sys 0m0.129s

real    0m4.003s
user    0m3.814s
sys 0m0.125s

real    0m4.058s
user    0m3.858s
sys 0m0.126s


Linq.Union.Distinct
real    0m7.579s
user    0m7.014s
sys 0m0.428s

real    0m7.498s
user    0m6.965s
sys 0m0.419s

real    0m7.596s
user    0m6.994s
sys 0m0.412s

real    0m7.446s
user    0m6.917s
sys 0m0.416s

real    0m7.452s
user    0m6.928s
sys 0m0.403s