当写一个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提供者可能能够更好地与多个where
s应对,而不是更复杂的表达;这是真的?
我个人始终与&&与2 where子句时,它不会使语句难以理解去。
在你的情况下,它可能不会是都明显可言,但有2 where子句肯定会影响性能,如果你有一个大集合,如果你用所有的结果从该查询。例如,如果您对结果调用.Count之间的(),或在整个列表循环,第一个where子句将运行,创建一个新的IEnumerable将再次完全列举,与第二委托。
链接2项条款一起导致查询,形成为集合列举了获取运行一个代表。这导致通过收集一个枚举和一个呼叫委托返回的结果每次。
如果拆分他们,事情的变化。作为第一个where子句枚举通过原始集合,第二where子句列举了它的结果。这将导致潜在(最坏情况),通过您的收藏2个全枚举和2名代表每个成员调用,这可能意味着该声明(理论上)可能需要2倍的运行速度。
如果你决定使用2个where子句,将更多的限制性条款将首先帮助了不少,因为第二where子句仅在通过第一个元素运行。
现在,在你的情况下,这并不重要。在一个大的集合,它可以。作为一般的经验法则,我去为:
1)可读性和可维护性
2)性能
在这种情况下,我认为这两种选择都同样易于维护,所以我会去为更高性能的选择。
这主要是个人风格问题。就个人而言,只要where
条款适合在同一行,我组的条款。
使用多个where
s将趋向于少高性能的,因为它需要为每个使得它远远元素额外的委托调用。然而,它很可能是一个微不足道的问题,如果探查表明它是一个问题时,才可考虑。
性能问题仅适用于基于内存中的集合... LINQ到SQL生成表达式树是推迟执行。更多详情点击这里:
像其他人所说,它更像是一个个人喜好。我喜欢使用&&的,因为它是更具可读性和模仿其他主流语言的语法。