2

IEnumberable には、2 つのパラメーターを受け取る拡張メソッド Contains<T> があります。最初のパラメータはチェックする値で、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 メソッドを呼び出すと、Equals("a","d") または Equals("d","a") になりますか?

4

2 に答える 2

3

それは重要ではありません-平等は対称的でなければなりません。のドキュメントからIEqualityComparer<T>.Equals

Equalsメソッドは、反射的、対称的、推移的です。つまり、オブジェクトをそれ自体と比較するために使用された場合、trueを返します。yとxに当てはまる場合、2つのオブジェクトxとyに当てはまります。xとyに当てはまり、yとzにも当てはまる場合は、2つのオブジェクトxとzに当てはまります。

の使用法が明確に定義されているとは思いませんEnumerable.Contains。つまり、将来のバージョンで変更される可能性があります。等式比較器をインターフェースのドキュメントに従わせるだけであれば、問題ありません。

于 2009-04-15T10:34:08.240 に答える
1

完全を期すために、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;
}
于 2009-04-20T08:12:15.917 に答える