Мне нужно просто для уточнения, что данный набор содержит элемент.
Я могу сделать это через 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();
}
}
Таким образом, там какие-либо другие методы должны использовать предикат?
.Any(predicate)
похоже на то, что вы хотите; возвращает bool
, возвращая true
, как только найдено совпадение, иначе false
. Существует также:
.All(predicate)
который ведет себя аналогичным образом, возвращая false
, как только найдено несовпадение, иначе true
.
Вы можете использовать Any(predicate)
.
Он вернет true или false в зависимости от того, существует ли предикат в определенной коллекции.