Подтвердить что ты не робот

Есть ли эквивалент "None()" в LINQ?

Я сталкивался с ситуациями, когда я чувствую, что мне не хватает метода расширения LINQ, который эффективно проверяет, нет ли совпадения с указанным предикатом в коллекции. Существует Any и All, но если я, например, использую следующий код:

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

Это возвращает true, если все объекты в коллекции находятся на расстоянии 0 или менее ярдов.

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

Это возвращает true, если в коллекции есть хотя бы один объект, который находится в 0 или менее ярдах от меня.

Пока все хорошо, оба эти метода имеют смысл, и синтаксис для них тоже имеет смысл. Теперь, если я хочу проверить, нет ли объекта с 0 или меньшим расстоянием, мне пришлось бы инвертировать предикат внутри метода All до >= 0 вместо <= 0 или вызвать !All(), который в некоторых случаи приводят к очень плохо читаемому коду.

Нет ли метода, эффективно выполняющего Collection.None(u => u.Distance <= 0), чтобы проверить, нет ли объекта в коллекции, который находится на расстоянии 0 или менее ярдов? Это синтаксический сахар больше, чем реальная проблема, но у меня просто ощущение, что оно отсутствует.

4b9b3361

Ответ 1

None совпадает с !Any, поэтому вы можете определить свой собственный метод расширения следующим образом:

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

Ответ 2

Вы можете написать свой собственный 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);
}