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

Что такое противоположный метод Any <T>

Как я могу проверить с Linq, если коллекция не содержит объекта. И.Е. Противоположность Any<T>.

Я мог инвертировать результат с помощью !, но для удобства чтения я задавался вопросом, был ли более эффективный способ сделать это? Должен ли я сам добавить расширение?

4b9b3361

Ответ 1

Вы можете легко создать метод расширения None:

public static bool None<TSource>(this IEnumerable<TSource> source)
{
    return !source.Any();
}

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

Ответ 2

Противоположность проверки того, что любая (по крайней мере одна) запись соответствует определенному критерию, будет проверять, что все записи не соответствуют критериям.

Вы не представили свой полный пример, но если вы хотели бы противопоставить что-то вроде:

var isJohnFound = MyRecords.Any(x => x.FirstName == "John");

Вы можете использовать:

var isJohnNotFound = MyRecords.All(x => x.FirstName != "John");

Ответ 3

В дополнение к добавленным ответам, если вы не хотите использовать метод Any(), вы можете реализовать None() следующим образом:

public static bool None<TSource>(this IEnumerable<TSource> source) 
{
    if (source == null) { throw new ArgumentNullException(nameof(source)); }

    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        return !enumerator.MoveNext();
    }
}

public static bool None<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    if (source == null) { throw new ArgumentNullException(nameof(source)); }
    if (predicate == null) { throw new ArgumentNullException(nameof(predicate)); }

    foreach (TSource item in source)
    {
        if (predicate(item))
        {
            return false;
        }
    }

    return true;
}

Кроме того, для беззаметной перегрузки вы можете применить оптимизацию ICollection<T>, которая на самом деле не существует в реализации LINQ.

ICollection<TSource> collection = source as ICollection<TSource>;
if (collection != null) { return collection.Count == 0; }

Ответ 4

Нашел этот поток, когда мне захотелось выяснить, не содержит ли один коллектив один объект, но я не хочу проверить, что объекты all в коллекции соответствуют указанному критерии. Я закончил делать проверку следующим образом:

var exists = modifiedCustomers.Any(x => x.Key == item.Key);

if (!exists)
{
    continue;
}