2011-01-14 9 views
3

使用System.Collections 2つの主キーを使用してコレクションを作成するにはどうすればよいですか?2つの主キーを持つハッシュテーブル

私は同じ組み合わせで新しいエントリが回避されているが、各キーは(SQLに2つの主キーを組み合わせたような)他のキーと一緒に使用できることを意味

+1

あなたが探している用語は、複合キーまたは複合キーです。 2つの属性を持つキーは、まだ2つではなく1つのキーです。 – sqlvogel

答えて

5

あなたは単にstructを使用することができ、例:

struct CompositeKey<T1,T2> 
{ 
    public T1 Item1; 
    public T2 Item2; 
} 

それをキーとして使用します。

+0

パフォーマンス上の理由からディクショナリを使用している場合は、構造体が意図したとおりに機能しない可能性があることに注意してください。 「[ValueType.GetHashCodeのネイティブ実装はどのように機能しますか?](http://stackoverflow.com/a/5927853/579344)」を参照してください。 – johv

+0

@johv:ハッシュコードは一意である必要はなく、.NETでもいくつかの衝突がかなり速く処理されます。明らかに多くの衝突が問題になります。 – leppie

+0

私は構造体のデフォルトの実装が非常に驚くべきで直感的ではないことを発見しました。私はタプルズが提供するものに近いものを期待していました。 – johv

2

.NET 4.0を使用している場合は、Tupleを使用できます。

これ以外の場合は、自分でタプルを作成できます。 StackOverflowの上で発見

また
Tuple<int,string> key = Tuple.Create(0, "Test"); 

、あなたがしている場合ということに注意してください。Tuples(or arrays) as Dictionary keys in C#

struct Tuple<T, U, W> : IEquatable<Tuple<T,U,W>> 
{ 
    readonly T first; 
    readonly U second; 
    readonly W third; 

    public Tuple(T first, U second, W third) 
    { 
     this.first = first; 
     this.second = second; 
     this.third = third; 
    } 

    public T First { get { return first; } } 
    public U Second { get { return second; } } 
    public W Third { get { return third; } } 

    public override int GetHashCode() 
    { 
     return first.GetHashCode()^second.GetHashCode()^third.GetHashCode(); 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj == null || GetType() != obj.GetType()) 
     { 
      return false; 
     } 
     return Equals((Tuple<T, U, W>)obj); 
    } 

    public bool Equals(Tuple<T, U, W> other) 
    { 
     return other.first.Equals(first) && other.second.Equals(second) && other.third.Equals(third); 
    } 
} 
+0

注:あなたのコードは 'null'アイテムを扱いません。 – leppie

2

LaGrandMereあなたは、.NET 4.0以降にしている場合は、System.Tupleを使用することができ、言ったように文字列、intsなどを辞書のキーとして入れておくと、SQLではNULLであったものを特別な場合にする必要があります。辞書にヌルキーを入れることはできません。

var dict = new Dictionary<Tuple<string, int>, string>(); 

var address1 = Tuple.Create("5th Avenue",15); 
var address2 = Tuple.Create("5th Avenue",25); 
var address3 = Tuple.Create("Dag Hammarskjölds väg", 4); 

dict[address1] = "Donald"; 
dict[address2] = "Bob"; 
dict[address3] = "Kalle"; 

// ... 

int number = Int32.Parse("25"); 
var addressKey = Tuple.Create("5th Avenue",number); 
string name = dict[addressKey]; // Bob 
関連する問題