在LINQ中是否有"None()"的等价物?

aev*_*tas 29 .net c# linq

我一直在遇到这样的情况,我觉得我缺少一个LINQ扩展方法,可以有效地检查集合中是否没有匹配的指定谓词.有AnyAll,但如果我例如使用以下代码:

if (Objects.All(u => u.Distance <= 0))

如果集合中的所有对象都在0码或更远的距离,则返回true.

if (Objects.Any(u => u.Distance <= 0))

如果集合中至少有一个对象距离我不到0码,则返回true.

到目前为止,这些方法都很有意义,而且它们的语法也很有意义.现在,如果我想检查是否没有距离为0或更小的对象,我必须将All方法内部的谓词反转>= 0<= 0或调用!All(),这在某些情况下会导致代码非常难以理解.

有没有方法可以有效Collection.None(u => u.Distance <= 0)地检查集合中是否有0码或更少的距离?它的语法糖不仅仅是一个实际的问题,但我只是觉得它缺失了.

dtb*_*dtb 34

None是一样的!Any,所以您可以定义自己的扩展方法,如下所示:

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

  • 不!`任何'.`!All`将从一件物品未通过测试的那一刻起成功.无表示没有通过测试的元素.`!All`可以解释为`AnyNot`.在逻辑中,`存在neg x`不等于`neg exists x` (7认同)
  • @aevitas`None`与`!All`不同,尽管可以创建一个`NotAll`扩展方法.但为什么不'HardlyAny`或`AFew`;) (6认同)

Ali*_*eza 6

你可以写自己的Extension Method:

public static bool None(this IEnumerable<T> collection, Func<T, bool> predicate)
{
  return collection.All(p=>predicate(p)==false);
}
Run Code Online (Sandbox Code Playgroud)

或者IQueryable<T>也是

public static bool None(this IQueryable<T> collection, Expression<Func<TSource, bool>> predicate)
{
  return collection.All(p=> predicate(p)==false);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`p =>!谓词(p)`更简洁. (3认同)
  • @KingKing是的.我说这是我个人的感觉,没什么大不了的.但有时候 '!' 隐藏在角色背后:) (3认同)
  • @KingKing但不太可读,虽然这是我个人的想法. (2认同)
  • `== false`的可读性较差,因为它不常见.另外,你不能在第二种情况下做`predicate(p)`,虽然你可以返回`!collection.Any(predicate)`,这也可以在第一个没有创建新委托的例子中获益. (2认同)