Есть ли эквивалент "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 или менее ярдов? Это синтаксический сахар больше, чем реальная проблема, но у меня просто ощущение, что оно отсутствует.
Ответы
Ответ 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);
}