2016-04-15 10 views
1

私は次の問題を克服しています。 複数のキーを使用する辞書を作成したいと思います。私は選択の方法としてタプルを提案するソリューションに沿って来ました。私はこれが良い方法だと思う。しかし、私の問題は次のような専門性を持っています。私はキーを "permutable"にしたいと思っています(私がここで間違ったスラングを使用していれば申し訳ありません)。私がこれを意味するのは、以下のとおりです。 dict[<key1,key2>の結果は、dict[<key2,<key1>]と同じにしておきたいと思います。なぜなら、保存したいデータは、キーの順番に対して不変であるからです。C# - 辞書のタプルまたは他のマルチキーバリアント、順列性あり

例として、次のコードを参照してください。当然のことながら、私は望んでいる結果を得られません。置換されたキーの結果をキータプルの結果と同じにしたい。

この理由は、2つのキーでインデックスを付ける必要があるデータを格納する必要がありますが、基本的に常に対称的です。だから、それを2回保管する必要はありません。

答えて

3

独自のカスタム等値比較子を定義し、辞書でそれを使用することができます。

class TupleComparer<T> : IEqualityComparer<Tuple<T, T>> 
{ 
    public bool Equals(Tuple<T, T> x, Tuple<T, T> y) 
    { 
     return object.Equals(x.Item1, y.Item1) && object.Equals(x.Item2, y.Item2) || 
       object.Equals(x.Item1, y.Item2) && object.Equals(x.Item2, y.Item1); 
    } 

    public int GetHashCode(Tuple<T, T> obj) 
    { 
     return obj.Item1.GetHashCode() + obj.Item2.GetHashCode(); 
    } 
} 

その後、あなたはそれを比較演算子のインスタンスを渡す辞書を作成することができます。

Tuple<string, string> key = new Tuple<string, string>("Name1", "Name2"); 

Dictionary<Tuple<string,string>, double> dict = 
    new Dictionary<Tuple<string, string>, double>(new TupleComparer<string>()); 

dict.Add(key, 5.0); 
Console.WriteLine(dict[key]); 

var permutedKey = new Tuple<string, string>("Name2", "Name1"); 
Console.WriteLine(dict[permutedKey]); 
+0

ありがとうございます。私は真剣にあなたが私を助けることができた方法に感心しています。残念なことに、私はあなたの答えをアップアップするという評判はありません。それでも、おかげです。それは完璧に動作しています。 – Johannes

+0

@Johannesこの回答があなたに役立つ場合は、歓迎します。受け入れられたと考えてください、ありがとう;) –

2

2つの要素で独自のクラスを定義し、IComparableを実装する必要があります。ここで、CompareToは要件に応じて記述されます。次に、そのクラスを辞書のキーとして使用します。また、メソッドGetHashCodeもオーバーライドしてください。

0

を比較していますあなたのユースケースの実現可能なオプションはList<string>ですか?もしそうなら、私はこのスタックオーバーフローANSERをお勧めします:あなたはList<string>を使用できない場合は、その後、私はrbaghbanliの答えに同意するだろう

Compare two List<T> objects for equality, ignoring order

関連する問題