IEnumerable <T>. Содержит предикат - PullRequest
29 голосов
/ 25 июля 2010

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

Я могу сделать это через 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();
    }   
}

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

Ответы [ 3 ]

60 голосов
/ 25 июля 2010
.Any(predicate)

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

.All(predicate)

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

8 голосов
/ 25 июля 2010

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

8 голосов
/ 25 июля 2010

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

...