我正在使用
a_list.All(item => !(item.field_is_true == true))
工作得很好,但我想知道是否有一个合适的LINQ方法来做相反的事情。
All()检查给定的谓词是否为所有项返回true。就框架开发而言,编写一个单独的方法来检查给定的谓词是否对所有项都返回false是没有意义的,因为很容易"不"谓词。但是,您可以编写自己的扩展方法:
public static bool None<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
return !source.Any(predicate);
}
与All()
完全相反的实质上是None
,但由于LINQ没有None()
方法,您可以通过!set.Any()
实现相同的结果。
!a_list.Any(item => item.matches == true)
如果a_list中没有一个项的matches
值为真,则生成true
。
另一个例子:
names.All(item => item.StartsWith("R"))
如果 names
中所有项都以R开头(如您已经知道的),为真。
!names.Any(item => item.StartsWith("R"))
如果none names
中以r开头的项为true
根据您下面的评论,听起来您可能只是在寻找一种方法来完成与当前代码片段相同的结果,但以不同的方式。这将提供与当前代码相同的结果,但是谓词中没有!
:
!a_list.Any(item => item.matches == true)
可以进一步简化为:
!a_list.Any(item => item.matches)
我想你的也可以简化为:
a_list.All(item => !item.matches)
很少有好的理由显式比较布尔值与true
或false
。
你写了:
a_list.All(item => !(item.field_is_true == true))
这就像在做:
a_list.All(item => item.flag== false) // more readable to me...
//return true if all of the items have a **flase** value on their flag
也可以使用.any()来达到相同的结果:
!a_list.Any(item => item.flag==true)
对于性能问题:.any()与.all() - 两者具有相同的性能(当使用linq to object时),在这里找到更多信息:linq: Not Any vs All Don't
不要对All()条件求反,只需对相同的谓词使用Any(),并适当地处理返回的布尔值。
所以,与其:
bool conditionDoesntExist = a_list.All(item => !(item.field_is_true == true));
你可以有
bool conditionDoesExist = a_list.Any(item => item.field_is_true == true)
注意标志名称的变化。(当然,我忽略了语义上的东西,比如原始谓词可以写成item => item.field_is_true == false
或简单地写成item => !item.field_is_true
)。
如果你想保持标志名称不变,那么仍然使用Any(),但要否定它:
bool conditionDoesntExist = !a_list.Any(item => item.field_is_true == true);
All
a_list.All(item => item.condition)
a_list.Any(item => item.condition)
并非所有
!a_list.All(item => item.condition)
或:
a_list.Any(item => !(item.condition))
!a_list.Any(item => item.condition)
或
a_list.All(item => !(item.condition))