2013-02-20 21 views
5

私はしばしば複数のvaules辞書に1つのキーが必要ですが、C#ではほとんどがDictionaryやHashtableのような2つのディメンションです。 >データ型を意味C#の複数の値の辞書に1つのキー?

var d = new Dictionary<key-dt,value1-dt,value2-dt,value3-dt,value4-dt>(); 

DT <内側:

は、私はこのような何かをしたいです。誰もがこれについてアイデアを持っていますか?

+1

値をリストにしたいと思っていますか? 'var d = new Dictionary >();'またはリストの保存先は何でも構いません。 –

+2

あなたは少し良くしたいものを説明する必要があります。現在の説明は本当に何も言いません。想定している辞書をどのように使用するかの例を挙げてください。 – Pete

+0

ディクショナリには2つの引数が必要です。最終的にここで何を達成しようとしていますか? – MethodMan

答えて

13

辞書はキーと値のペアで、値はキーに応じて取得されます。キーはすべてユニークです。

今、あなたはDictionary 1とキータイプと、複数の値の型をしたい場合、あなたはいくつかのオプションがあります。

最初は、と(他が使用するTuple

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

を使用することですC#4.0以上):

var dict = new Dictionary<KeyType, dynamic>()

は、任意のタイプの値を持つことができます。

using System; 
using System.Linq; 
using System.Collections.Generic; 

public class Test { 
    public static void Main(string[] args) { 
     dynamic d1 = new System.Dynamic.ExpandoObject(); 
    var dict = new Dictionary<int, dynamic>(); 
     dict[1] = d1; 
     dict[1].FooBar = "Aniket"; 
     Console.WriteLine(dict[1].FooBar); 
     dict[1].FooBar = new {s1="Hello", s2="World", s3=10}; 
     Console.WriteLine(dict[1].FooBar.s1); 
     Console.WriteLine(dict[1].FooBar.s3); 
    } 
} 
+0

これを説明してもらえますか? 'dict [1] = d1; dict [1] .FooBar = "Aniket"; '?私が理解した 'dic [1] .FooBar = Aniketは辞書のキーですが、その場合の' FooBar'はどういう意味ですか? – vladimir

+0

@vladimirこの場合の '.FooBar'は、何でも構いません。同じコードを使用して '.FooBar'を' .vladimir'に置き換えることができます。これは動作します。私は実行時に、 'fooBar'と呼ばれる' dict'を指す 'dict [1]'にプロパティを動的に作成しました。 –

1

tupleをキーとして使用してください。

var d = new Dictionary<Tuple<string,string,bool,int>,any-data-typs>(); 
+2

キーとしてこれらのタイプの1つを使用し、値としてタプル<...>を使用することをお勧めします。 –

+0

ありがとう、これは私が欲しいものです。私はこのように使用します: var d =新しい辞書(); – Gisway

+0

@ LukaszM - 私が理解したのは、彼が複合キーを望んでいたことでした。 –

4

クラスの適切なキーフィールドと適切な値フィールドの両方を記述します。とそのタイプの辞書を使用してください。

var dictionary = new Dictionary<TheKeyType, TheValuesType>(); 

注:キーとして動作する複数の値を持っている場合は、それらの値をカプセル化し、GetHashCodeメソッドの正しいオーバーライドを提供するために、クラスを定義すると辞書が自分の平等を認めることができるように等しいです。

タプルを利用することはできませんが、タプルは自己記述的ではないため、このパターンを制限する必要があります。

var dictionary = new Dictionary<Tuple<Key1Type, Key2Type, Etc>, Tuple<Value1Type, Value2Type, Etc>>(); 
1

代わりに完全に有効なソリューションであるタプルを、使用しての、私はキーおよび/または値として独自のクラスを作成するにはお勧めします。

タプルがコードを読みにくくなることがわかるかもしれません。

+0

彼はEquals()とGetHashCode()を手動で実装しなければならないと警告しています。 –

+0

@ SystemDown:それを指摘してくれてありがとう。 1つはほとんどのトレードオフを決定します –

+2

@ SystemDownこれは、カスタムクラスがキーである場合にのみ当てはまります。それが必要でない値ならば。 – Servy

関連する問題