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

时间:2013-10-12 19:11:28

标签: c# .net 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码或更短距离的对象?它的语法糖不仅仅是一个实际的问题,但我只是觉得它缺失了。

3 个答案:

答案 0 :(得分:32)

None!Any相同,因此您可以按如下方式定义自己的扩展方法:

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

答案 1 :(得分:5)

您可以自己编写Extension Method

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

IQueryable<T>以及

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

答案 2 :(得分:0)

甚至更短的版本

static class LinqExtensions
{
    public static bool None<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) => !source.Any(predicate);
}