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

IEnumerable <T>. Содержит предикат

Мне нужно просто уточнить, что данная коллекция содержит элемент.

Я могу сделать это через collection.Count(foo => foo.Bar == "Bar") > 0), но он сделает ненужное задание - итерации всей коллекции, в то время как мне нужно остановиться в первом случае.

Но я хочу попытаться использовать Contains() с предикатом, например. foo => foo.Bar == "Bar".

В настоящее время IEnumerable<T>.Contains имеет две подписи:

  • IEnumerable<T>.Contains(T)

  • IEnumerable<T>.Contains(T, IEqualityComparer<T>)

Поэтому я должен указать некоторую переменную для проверки:

var collection = new List<Foo>() { foo, bar };
collection.Contains(foo);

или напишите мой пользовательский IEqualityComparer<Foo>, который будет использоваться против моей коллекции:

class FooComparer : IEqualityComparer<Foo>
{
    public bool Equals(Foo f1, Foo f2)
    {
        return (f1.Bar == f2.Bar); // my predicate
    }

    public int GetHashCode(Foo f)
    {
        return f.GetHashCode();
    }   
}

Итак, есть ли другие методы использования предиката?

4b9b3361

Ответ 1

.Any(predicate)

звучит так, как вы хотите; возвращает bool, возвращая true, как только будет найдено совпадение, else false. Существует также:

.All(predicate)

который ведет себя аналогичным образом, возвращая false, как только будет найден несоответствие, else true.

Ответ 2

Вы можете использовать Any(predicate). Он вернет true или false в зависимости от того, существует ли предикат в определенной коллекции.

Ответ 3

Посмотрите расширение IEnumerable<T>.Any.