LINQ的All方法是否相反?

时间:2013-01-20 06:22:44

标签: c# linq

我正在使用

a_list.All(item => !(item.field_is_true == true))

效果很好,但我想知道是否有适当的LINQ方法来做相反的事情。

5 个答案:

答案 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)

很少有理由明确将布尔值与truefalse进行比较。

答案 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))