快速结合两大名单

时间:2016-01-21 05:14:28

标签: c# linq union plinq

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

1 个答案:

答案 0 :(得分:3)

您没有说明列表中的项目是什么,但是一个选项是使用适当的数据结构来执行此任务 - 您只想保留唯一项目 - 它是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