C# 给定以下linq查询,哪一个是';性能更高';?

C# 给定以下linq查询,哪一个是';性能更高';?,c#,.net,linq,parallel-processing,C#,.net,Linq,Parallel Processing,对于每个包含一些linq的语句,给出下面的,我需要以Distinct的形式遍历列表。因此,我有很多地方可以添加Distict()语句 有人能解释一下我应该使用哪种解决方案以及原因吗?我对使用aspallel()非常陌生,所以我不确定该使用哪种解决方案 现有代码(缺少该代码,需要使用Distinct()) 选项1:区分整个结果。 我觉得这会返回太多的信息(最初) 选项2:在并行之前对每个列表进行区分 选项3:在并行后,对每个列表进行区分 是的-我可以用秒表等创建自己的测试代码。。但我不是在追求指标

对于每个包含一些linq的语句,给出下面的
,我需要以
Distinct
的形式遍历列表。因此,我有很多地方可以添加
Distict()
语句

有人能解释一下我应该使用哪种解决方案以及原因吗?我对使用
aspallel()
非常陌生,所以我不确定该使用哪种解决方案

现有代码(缺少该代码,需要使用Distinct()) 选项1:区分整个结果。 我觉得这会返回太多的信息(最初)

选项2:在并行之前对每个列表进行区分 选项3:在并行后,对每个列表进行区分 是的-我可以用秒表等创建自己的测试代码。。但我不是在追求指标,而是在追求理论(关于我应该做什么……因为XXXXX)

在这个问题变成一个主观问题并关闭之前,请考虑你的答案。
**其次,我知道这里的性能很小。。因此,重复一下,我并不太担心-actual-perf差异,而是理论上的差异。

选项1和3将导致相同的执行路径。在这两种情况下,
aspallel
的结果都会调用
Distinct
。这意味着问题实际上可以归结为在
aspallel()
之前还是之后调用Distinct更好

基于它的实际实现,它只使用了非并行的
可枚举.Distinct
,我想说,它在您的情况下没有任何区别,因为这里实际上没有查询。您只是在区分现有列表。您可能根本不应该在这里使用
aspallel


如果您确实有一个查询,那么调用
Distinct
last可能会更好,因为它不会并行执行,如果在较小的集合上执行,可能会更快,而较小的集合已经被并行过滤。但是这部分答案需要实际的基准测试来验证。

旁注:我不相信
foreach
知道ParallelQuery,并且会使用常规的
IEnumerable
(没有并行执行)…感谢我所追求的答案类型:)问题:那么
AsParallel()
不会并行分解所有列表项吗?例如,如果列表中有10个项目,是否会同步检索每个项目?或者同时有几个项目(平行)?@Pure.Krome:“检索”是什么意思?如果您有一个列表,则这些项已经存在。
foreach
循环“检索”集合中的每个项,然后对其进行处理。我以为
.aspallel()
是对
的每一个
说的。。不要一个接一个地获取这些,而是并行地获取(一次2个或3个,等等)。。因为内部范围的结果独立于每个“项”。(如果这更有意义的话)@Pure.Krome:啊,这就是你的意思。不,那不会发生
AsParallel
只会使它后面的查询并行运行。在您的情况下,没有查询,因此调用
aspallel
没有好处或理由。似乎你真的在寻找。
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 
}