2010-07-25 5 views
28

Мне нужно просто уточнить, что данная коллекция содержит элемент.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(); 
    } 
} 

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

ответ

58
.Any(predicate) 

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

.All(predicate) 

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

8

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

8

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