我想知道如何以最有效的方式实现这一目标。

我应该使用

a.RemoveAll(x => b.AsParallel().Any(y => y == x));


要么

a.AsParallel().Except(b.AsParallel());


或者是其他东西?

谁能解释其根本区别是什么?从我的角度来看,第二行似乎较慢。这是什么原因呢?

最佳答案

使用带有两个ParallelQuery<T>操作的第二个选项,将并行执行整个操作:

var results = a.AsParallel().Except(b.AsParallel());


第一个选项对删除进行顺序检查,并且必须为每次迭代构建ParallelQuery<T>,这可能会慢得多。

但是,取决于元素的数量,实际上在没有AsParallel的情况下运行起来可能会更快:

var results = a.Except(b);


在许多情况下,为较小的集合进行并行处理的开销超过了收益。在这种情况下,唯一的了解方法就是分析和衡量所涉及的选项。


  从我的角度来看,第二行似乎较慢。这是什么原因呢?


这可能是由于许多因素造成的。首先,确保您在发行版本中不在VS主机上运行(这是一个常见问题)。否则,这可能是由于集合的大小和所涉及的数据类型造成的。

08-06 18:50