web-dev-qa-db-ja.com

IEnumerable <T>。述語を含む

特定のコレクションに要素が含まれていることを明確にする必要があります。

collection.Count(foo => foo.Bar == "Bar") > 0)を介してそれを行うことはできますが、不要な作業を実行します。最初の発生で停止する必要がある間、コレクション全体を繰り返します。

しかし、述語でContains()を使用してみたいと思います。 _foo => foo.Bar == "Bar"_。

現在、_IEnumerable<T>.Contains_には2つの署名があります。

  • 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
.Any(predicate)

あなたが望むもののように聞こえます。 boolを返し、一致するものが見つかるとすぐにtrueを返します。それ以外の場合は、falseを返します。もあります:

.All(predicate)

これは同様に動作し、一致しないものが見つかるとすぐにfalseを返します。それ以外の場合は、trueを返します。

61
Marc Gravell

Any(predicate)を使用できます。述語が特定のコレクションに存在するかどうかに応じて、trueまたはfalseを返します。

8
sTodorov

IEnumerable<T>.Any拡張子を見てください。

8
Florian Reischl