2013-02-20 86 views
5

我經常需要一個鍵到多個字母字典,但在C#中,他們中的大多數是像Dictionary和Hashtable這樣的兩個維度。在C#中的多值字典的一個關鍵?

我想是這樣的:

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

DT內<>表示數據類型。任何人都有這個想法?

+1

我假設你想要一個鍵值對,值是一個列表?這是有效的:'var d = new Dictionary >();'或者任何你想要存儲的列表。 – 2013-02-20 18:23:37

+2

你需要解釋一下你想要更好一點。目前的解釋並沒有說明什麼。舉一個你如何使用你設想的字典的例子。 – Pete 2013-02-20 18:23:48

+0

字典需要2個參數,所以你最終試圖在這裏實現什麼? – MethodMan 2013-02-20 18:23:57

回答

13

字典是一個鍵值對,其中值取決於鍵。鑰匙都是獨一無二的。

現在,如果你想有一個Dictionary 1周的KeyType和多值類型,你有幾種選擇:

第一種是使用一個Tuple

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

另一種是使用(與C#4.0以上):

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

System.Dynamic.ExpandoObject可以具有任何類型的值。

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 2017-10-12 13:48:21

+0

@vladimir在這種情況下'.FooBar'意味着它可以是任何東西。你可以使用相同的代碼並用'.vladimir'替換'.FooBar',它仍然可以工作。我在運行時動態地在'dict [1]'(它指向'd1')中創建了一個名爲'FooBar'的屬性 – 2017-10-12 16:56:24

1

使用tuple作爲關鍵。

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

我會建議寧願使用這些類型中的一個作爲鍵,而Tuple <...>作爲值。 – 2013-02-20 18:29:23

+0

謝謝,這是我想要的。我會像這樣使用它: var d = new Dictionary >(); – Gisway 2013-02-20 18:29:58

+0

@LukaszM - 我理解的方式是他想要一個複合鍵。 – 2013-02-20 18:30:21

4

描述適當的關鍵字段和適當的值域與類。並使用這些類型的字典。

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

注意:如果你有作爲的關鍵多個值,你會定義一個類來封裝這些值,並提供GetHashCode的適當的覆蓋和equals以便詞典能認識到自己的平等。

這樣做的缺點是,你可以利用元組,但是你想限制這種模式,因爲元組是非自描述的。

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

而不是使用一個元組,這是一個非常有效的解決方案,我會建議創建自己的類作爲鍵和/或值。

您可能會意識到元組將變成難以閱讀的代碼。

+0

注意他必須手動實現Equals()和GetHashCode()。 – 2013-02-20 18:28:40

+0

@SystemDown:感謝您指出。其中一個決定權衡 – 2013-02-20 18:37:09

+2

@SystemDown只有在自定義類是關鍵時纔是如此,如果這是不需要的價值。 – Servy 2013-02-20 18:37:39

相關問題