我应该用两个“其中”条款“&&”在我的LINQ查询还是?

问题描述 投票:69回答:4

当写一个LINQ查询有多个“和”的条件,我应该写含where或多个&&条款,每个conditon单where条款?

static void Main(string[] args)
{
    var ints = new List<int>(Enumerable.Range(-10, 20));

    var positiveEvensA = from i in ints
                         where (i > 0) && ((i % 2) == 0)
                         select i;

    var positiveEvensB = from i in ints
                         where i > 0
                         where (i % 2) == 0
                         select i;

    System.Diagnostics.Debug.Assert(positiveEvensA.Count() == 
                                         positiveEvensB.Count());
}

是否有任何差别比positiveEvensA和positiveEvensB之间的个人喜好或编码风格(排长队,可读性等)等?

我想到的一个可能的区别在于不同的LINQ提供者可能能够更好地与多个wheres应对,而不是更复杂的表达;这是真的?

c# .net linq
4个回答
47
投票

我个人始终与&&与2 where子句时,它不会使语句难以理解去。

在你的情况下,它可能不会是都明显可言,但有2 where子句肯定会影响性能,如果你有一个大集合,如果你用所有的结果从该查询。例如,如果您对结果调用.Count之间的(),或在整个列表循环,第一个where子句将运行,创建一个新的IEnumerable将再次完全列举,与第二委托。

链接2项条款一起导致查询,形成为集合列举了获取运行一个代表。这导致通过收集一个枚举和一个呼叫委托返回的结果每次。

如果拆分他们,事情的变化。作为第一个where子句枚举通过原始集合,第二where子句列举了它的结果。这将导致潜在(最坏情况),通过您的收藏2个全枚举和2名代表每个成员调用,这可能意味着该声明(理论上)可能需要2倍的运行速度。

如果你决定使用2个where子句,将更多的限制性条款将首先帮助了不少,因为第二where子句仅在通过第一个元素运行。

现在,在你的情况下,这并不重要。在一个大的集合,它可以。作为一般的经验法则,我去为:

1)可读性和可维护性

2)性能

在这种情况下,我认为这两种选择都同样易于维护,所以我会去为更高性能的选择。


20
投票

这主要是个人风格问题。就个人而言,只要where条款适合在同一行,我组的条款。

使用多个wheres将趋向于少高性能的,因为它需要为每个使得它远远元素额外的委托调用。然而,它很可能是一个微不足道的问题,如果探查表明它是一个问题时,才可考虑。


5
投票

性能问题仅适用于基于内存中的集合... LINQ到SQL生成表达式树是推迟执行。更多详情点击这里:

Multiple WHERE Clauses with LINQ extension methods


1
投票

像其他人所说,它更像是一个个人喜好。我喜欢使用&&的,因为它是更具可读性和模仿其他主流语言的语法。

© www.soinside.com 2019 - 2024. All rights reserved.