18

リストをキーとする辞書があります:

private Dictionary<List<custom_obj>, string> Lookup;

ContainsKey を使用しようとしていますが、機能していないようで、理由がわかりません。Visual Studio のイミディエイト ウィンドウからのデバッグ情報は次のとおりです。

?Lookup.Keys.ElementAt(7)[0]
{custom_obj}
    Direction: Down
    SID: 2540
?Lookup.Keys.ElementAt(7)[1]
{custom_obj}
    Direction: Down
    SID: 2550
searchObject[0]
{custom_obj}
    Direction: Down
    SID: 2540
searchObject[1]
{custom_obj}
    Direction: Down
    SID: 2550
?Lookup.ContainsKey(searchObject)
false

私の常識では、最後の ContainsKey は true でなければなりません。ここに十分な情報が含まれていることを願っています...何かアイデアはありますか?

ありがとう!

4

4 に答える 4

18

キーとして機能するList<custom_obj>インスタンスは、searchObject によって参照されるインスタンスと参照的に等しくありません。

ディクショナリで参照等価性の代わりにリスト内の値を使用して一致するキーを検索する場合は、ディクショナリのコンストラクタでIEqualityComparer を指定する必要があります (Equals と GetHashCode をオーバーライドできないためList<T>)。

于 2012-04-04T23:15:01.423 に答える
13

List同じ要素を含む2 つの別個の があります。2 つのリストが等しいかどうかを確認する正しい方法は、SequenceEqualメソッドを使用することです。

デフォルトでは、やろうとしていることはできません。ただし、カスタムを作成してコンストラクターIEqualityComparerに渡すことはできます。Dictionary

以下はジェネリックのサンプルIEqualityComparerです。

class ListComparer<T> : IEqualityComparer<List<T>>
{
    public bool Equals(List<T> x, List<T> y)
    {
        return x.SequenceEqual(y);
    }

    public int GetHashCode(List<T> obj)
    {
        int hashcode = 0;
        foreach (T t in obj)
        {
            hashcode ^= t.GetHashCode();
        }
        return hashcode;
    }
}

GetHashCodeこれは簡単な解決策だったので、実装を改善することをお勧めします。

于 2012-04-04T23:15:54.390 に答える
3

これは、ルックアップで使用される実際のリスト インスタンスが、キーとして追加されたインスタンスと同じ場合にのみ機能します。リストの内容は比較されません。これは、2 つの List オブジェクトを直接比較しようとした場合と同じ動作です。

于 2012-04-04T23:15:22.280 に答える
0

ルックアップ メソッドで使用しているインスタンスが、辞書のキーの中にあるインスタンスと同じであると確信していますか? それが私が考えることができる唯一のことです。

于 2012-04-04T23:16:56.980 に答える