IEnumerable <T>.Contains с предикатом

Мне нужно просто для уточнения, что данный набор содержит элемент.

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

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

30
задан abatishchev 25 July 2010 в 10:04
поделиться

3 ответа

.Any(predicate)

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

.All(predicate)

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

61
ответ дан 27 November 2019 в 23:21
поделиться

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

8
ответ дан 27 November 2019 в 23:21
поделиться

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

8
ответ дан 27 November 2019 в 23:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: