IEnumerable <T>. Содержит предикат
Мне нужно просто уточнить, что данная коллекция содержит элемент.
Я могу сделать это через collection.Count(foo => foo.Bar == "Bar") > 0)
, но он сделает ненужное задание - итерации всей коллекции, в то время как мне нужно остановиться в первом случае.
Но я хочу попытаться использовать Contains()
с предикатом, например. foo => foo.Bar == "Bar"
.
В настоящее время IEnumerable<T>.Contains
имеет две подписи:
Поэтому я должен указать некоторую переменную для проверки:
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();
}
}
Итак, есть ли другие методы использования предиката?
Ответы
Ответ 1
.Any(predicate)
звучит так, как вы хотите; возвращает bool
, возвращая true
, как только будет найдено совпадение, else false
. Существует также:
.All(predicate)
который ведет себя аналогичным образом, возвращая false
, как только будет найден несоответствие, else true
.
Ответ 2
Вы можете использовать Any(predicate)
.
Он вернет true или false в зависимости от того, существует ли предикат в определенной коллекции.
Ответ 3
Посмотрите расширение IEnumerable<T>.Any
.