我正在使用
a_list.All(item => !(item.field_is_true == true))
效果很好,但我想知道是否有适当的LINQ方法来做相反的事情。
答案 0 :(得分:22)
All()检查给定Predicate是否为所有项返回true。在框架开发方面,编写一个单独的方法来检查给定的Predicate是否为所有项返回false是没有任何意义的,因为它很容易“不”一个谓词。 但是,您可以编写自己的扩展方法:
public static bool None<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
return !source.Any(predicate);
}
答案 1 :(得分:6)
与All()
完全相反的是None
,但由于LINQ没有None()
方法,因此您可以通过!set.Any()
完成相同的结果。
!a_list.Any(item => !(item.matches == true))
如果a_list中的所有项都没有true
值,则会生成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
或false
进行比较。
答案 2 :(得分:2)
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() vs .all() - 两者的性能相同 (当使用linq to object时),请在此处找到更多信息:LINQ: Not Any vs All Don't
答案 3 :(得分:1)
不要否定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);
答案 4 :(得分:0)
全部
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))