Что такое противоположный метод любого



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



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

501   4  

4 ответов:

Вы можете легко создать 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);
}

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

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

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

вы могли бы использовать:

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

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

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

if (!exists)
{
    continue;
}

В дополнение к ответам, Если вы не хотите, чтобы обернуть 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 implemenetation.

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

Comments

    Ничего не найдено.