39

我一直遇到我觉得缺少 LINQ 扩展方法的情况,该方法有效地检查集合中指定谓词是否不匹配。有Anyand All,但如果我例如使用以下代码:

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 码或更短的对象?它是语法糖而不是实际问题,但我只是觉得它缺失了。

4

3 回答 3

44

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

public static class EnumerableExtensions
{
    public static bool None<TSource>(this IEnumerable<TSource> source,
                                     Func<TSource, bool> predicate)
    {
        return !source.Any(predicate);
    }
}
于 2013-10-12T19:14:12.890 回答
6

你可以自己写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);
}
于 2013-10-12T19:15:57.963 回答
1

更短的版本

static class LinqExtensions
{
    public static bool None<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) => !source.Any(predicate);
}
于 2019-05-30T03:58:30.607 回答