LINQ的All方法是否相反?

Tan*_*ash 14 c# linq

我正在使用

a_list.All(item => !(item.field_is_true == true))
Run Code Online (Sandbox Code Playgroud)

哪个效果很好,但我想知道是否有一个合适的LINQ方法来做相反的事情.

Ere*_*mez 24

All()检查给定Predicate是否为所有项返回true.在框架开发方面,编写一个单独的方法来检查给定的Predicate是否为所有项返回false是没有任何意义的,因为它很容易"不"一个谓词.但是,您可以编写自己的扩展方法:

public static bool None<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
    return !source.Any(predicate);
}
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用`Func <T,bool>`而不是`Predicate <T>` (3认同)

JLR*_*she 6

完全相反的All()基本上是None,但由于LINQ没有None()方法,你可以通过完成相同的结果!set.Any().

!a_list.Any(item => !(item.matches == true))
Run Code Online (Sandbox Code Playgroud)

true如果a_list中的所有项都没有matches值,则会产生这种情况.

这个双重否定有点令人困惑,所以提供一个更简单的例子:

names.All(item => item.StartsWith("R"))
Run Code Online (Sandbox Code Playgroud)

如果所有项目都names以R开头(如您所知),则为true .

!names.Any(item => item.StartsWith("R"))
Run Code Online (Sandbox Code Playgroud)

如果没有names以R开头的项目,则为true

根据您在下面的评论,听起来您可能正在寻找一种方法来完成与当前代码片段相同的结果,但方式不同.这应该提供与当前代码相同的结果,但没有!谓词中的:

!a_list.Any(item => item.matches == true)
Run Code Online (Sandbox Code Playgroud)

这可以进一步简化为:

!a_list.Any(item => item.matches)
Run Code Online (Sandbox Code Playgroud)

我想你的也可以简化,对此:

a_list.All(item => !item.matches)
Run Code Online (Sandbox Code Playgroud)

很少有理由明确地将布尔值与trueor 进行比较false.