C# 林氏;布尔函数

C# 林氏;布尔函数,c#,linq,boolean,C#,Linq,Boolean,有什么方法可以应用带有签名的函数吗 bool IsOdd(int number); 返回一个整数数组,并返回该数组中的任何给定整数在单个指令中是否为奇数?我知道我可以用 return (array.Where(IsOdd).Count() > 0); 但这意味着调用两个方法并进行比较。。。难道没有一个更简单的方法来达到同样的效果吗?是的 首先,您可以使用Count的形式,它采用谓词: return array.Count(IsOdd) > 0; 。。。但你不想这么做。该代码仍然

有什么方法可以应用带有签名的函数吗

bool IsOdd(int number);
返回一个整数数组,并返回该数组中的任何给定整数在单个指令中是否为奇数?我知道我可以用

return (array.Where(IsOdd).Count() > 0);
但这意味着调用两个方法并进行比较。。。难道没有一个更简单的方法来达到同样的效果吗?

是的

首先,您可以使用
Count
的形式,它采用谓词:

return array.Count(IsOdd) > 0;
。。。但你不想这么做。该代码仍然表示一个不必要的数值比较。您想询问数组中是否有奇数项。换言之:

return array.Any(IsOdd);
这不仅更具表现力,而且可能更快。只要
Any
找到一个匹配项,它就会返回
true
——而
Count
必须遍历整个数组才能准确地找出有多少个匹配项


基本上,每当您看到使用
Count()>0的LINQ查询时,您应该考虑使用
Any
。在某些情况下,对于基于表达式树的查询,例如LINQ to SQL,它可能不会产生性能差异(如果查询优化器可以看到与0的比较),但在LINQ to Objects中,它肯定可以产生性能差异。

@Jon:只要
Count()>0
部分本身在LINQ查询中,LINQ to SQL就可以对其进行优化,但是如果您正在编写
if(col.Count()>0)
,那么LINQ to SQL将为您进行计数,因为LINQ to SQL和C#显然无法共同为您进行优化。因此,即使使用LINQ-to-SQL(或任何O/RM),它也会有所不同。更不用说
array.any(IsOdd)
与编程语言中的真正英语一样接近。此外,一些ORM(包括LINQ-to-SQL)将any转换为EXSITS,它与LINQ-to对象中的任何对象具有相同的短路行为。