鉴于以下for each
语句中包含一些linq,我需要以Distinct
的形式遍历列表。所以我有很多地方可以添加Distict()
语句。
有人可以解释我应该使用哪种解决方案以及为什么?我对使用AsParallel()
非常陌生,所以我不确定要采用哪种解决方案..
Distinct()
)foreach (var phrase in (something != null
? ListOne.AsParallel()
: ListTwo.AsParallel()))
{
... // irrelevant for this question
}
foreach (var phrase in (something != null
? ListOne.AsParallel()
: ListTwo.AsParallel()).Distinct())
{
... // irrelevant for this question
}
我觉得这会回复太多信息(最初)。
foreach (var phrase in (something != null
? ListOne.Distinct().AsParallel()
: ListTwo.Distinct().AsParallel()))
{
... // irrelevant for this question
}
foreach (var phrase in (something != null
? ListOne.AsParallel().Distinct()
: ListTwo.AsParallel().Distinct() ))
{
... // irrelevant for this question
}
是的 - 我可以使用秒表创建自己的测试代码等等。但我不是那么多指标,而是更多的理论(关于我应该做什么......因为XXXXX)。
**在此变为主观问题并关闭之前,请考虑您的答案。 **其次,我理解这里的穿孔很小..所以只是为了迭代,我不是那么担心 - 实际 - 性能差异,而是理论差异。
答案 0 :(得分:4)
选项1和3将产生相同的执行路径。在这两种情况下,Distinct
的结果都会调用AsParallel
。这意味着问题实际上归结为在AsParallel()
之前或之后调用Distinct是否更好。
基于ParallelEnumerable.Distinct()
的实际实现,它只使用非并行Enumerable.Distinct
我会说它在你的情况下完全没有区别,因为你这里实际上没有查询。您只是区分现有列表。您可能根本不应该在这里使用AsParallel
。
如果您确实有查询,最好最后调用Distinct
,因为它不会并行执行,并且如果在较小的集合上执行可能会更快 - 已经过滤掉了在平行下。但这部分答案需要验证实际的基准测试。