我目前正在使用
a_list.All(item => !(item.field_is_true == true))
效果很好,但我想知道是否有合适的 LINQ 方法来做相反的事情。
All() 检查给定 Predicate 是否对所有项目返回 true。在框架开发方面,编写一个单独的方法来检查给定 Predicate 是否对所有项目返回 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)
true
如果 a_list 中没有任何项目的matches
值为真,这将产生。
另一个例子:
names.All(item => item.StartsWith("R"))
如果所有项目都names
以 R 开头(如您所知),则为真。
!names.Any(item => item.StartsWith("R"))
如果没有names
以 R 开头的项目,则为真。
根据您在下面的评论,听起来您可能只是在寻找一种方法来完成与当前代码片段相同的结果,但方式不同。这应该提供与您当前代码相同的结果,但!
在谓词中没有:
!a_list.Any(item => item.matches == true)
这可以进一步简化为:
!a_list.Any(item => item.matches)
我想你的也可以简化为:
a_list.All(item => !item.matches)
很少有充分的理由明确地将布尔值与true
or进行比较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);
全部
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))