IEnumerable.Containsと共に使用IEqualityComparer.Equalsは、xまたはyリスト中の値はありますか?

StackOverflow https://stackoverflow.com/questions/751081

質問

IEnumberableは、拡張メソッドは 2つのパラメータをとるが含まれています。最初のパラメータはをチェックする値であり、第二は、されたIEqualityComparerの実装です。 IEqualityComparer.Equalsを見て、それは、比較する前記第1および第2のオブジェクトのために、xおよびyという2つのパラメータを取ります。

私の質問は、XまたはYのIEnumerableから値はありますか?

の例

List<string> test = new List<String() { "a", "b", "c" };
test.Contains("d", myComparer);
それは最初の値に対してEqualsメソッドを呼び出すと

はなり 等号( "A"、 "D")または等号( "D"、 "A")?

役に立ちましたか?

解決

これは問題ではないはず - 平等は対称でなければなりません。

IEqualityComparer<T>.Equals のドキュメントから
  

Equalsメソッドは、反射的です   対称、推移。それだ   比較するために使用される場合はtrueを返します。   自分自身を持つオブジェクト。 2のための真   オブジェクトのxとyはyのために真である場合   かつx;そして二つのオブジェクトxについて真と   Zそれはまた、xとyとのために真である場合   YおよびZについても同様。

私はEnumerable.Containsでの使用は、すなわち、それは将来のバージョンで変更される可能性があり、明確に定義されているとは思いません。あなたは自分の等値比較は、インターフェイスのドキュメントに従う作る場合、あなたは大丈夫です。

他のヒント

完全を期すためIEnumberableの反射されたコードは、それが左側にあることを示している(下記参照)。それを使用する際の危険があるのでしかし、これまで変更しないことを約束されていないこと。

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer)
{
    if (comparer == null)
    {
        comparer = EqualityComparer<TSource>.Default;
    }
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    foreach (TSource local in source)
    {
        if (comparer.Equals(local, value))
        {
            return true;
        }
    }
    return false;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top