2011-03-02 36 views
8

我想使用像Dictionary這樣的通用集合,但Dictionary要求每個密鑰都是唯一的。我有相同的「關鍵」的多個值,所以我需要一個通用的集合,將允許。是否有一個帶鍵/值對的泛型集合,其中的鍵可以多次出現?

我意識到這使得不再是一個真正的關鍵,但我不知道還有什麼可以稱它的。

+1

對於任何人誰在乎,我最終只是其中一個參考我想在值對象內跟蹤的值。然後我使用List ,並能夠通過我的對象中的propery訪問該值。感謝所有回答的人。我將在未來使用這些信息。 – richard 2011-03-02 22:52:32

+0

可能重複的[在.NET字典中的重複鍵?](http://stackoverflow.com/questions/146204/duplicate-keys-in-net-dictionaries) – nawfal 2013-11-05 07:32:34

回答

16

幾個選項供您參考:

  • 使用Dictionary<TKey, List<TValue>> - 保持每個值的列表鍵,不會阻止重複值爲相同的密鑰(即重複對);
  • 使用Dictionary<TKey, HashSet<TValue>> - 保持設定的值爲每個鍵,防止重複值對於相同的密鑰;
  • 使用一個List<KeyValuePair<TKey, TValue>> - 保留一個對的列表,不阻止同一個鍵的重複值值。

注意,在後一種情況下KeyValuePairstruct,而不是一個class,因此暗示有點不同的處理。

正確的選項取決於您的實際使用情況。

+0

我認爲你的第二個建議對我最有意義。這將允許我遍歷鍵並獲取值,但不要求鍵在整個集合中是唯一的。那是對的嗎? – richard 2011-03-02 22:35:46

+0

是的,這是正確的。另請注意,它不會阻止存儲重複對。如果這是一個問題,使用HashSet的第一種方法會更好。 (編輯我的回答覆蓋。) – 2011-03-02 22:38:49

+1

好的答案! :-) – 2011-03-02 22:50:28

0

嘗試Dictionary<KeyType,List<ValueType>>

您可以創建自定義詞典,該詞典包裝此詞典以處理添加和刪除時所需的所有邏輯。

+0

字典將需要_KeyType_是唯一的。我想多次使用相同的鍵值。 – richard 2011-03-02 22:32:52

2

您可以創建一個Dictionary<TKey,List<TValue>>並自己完成手動工作,但默認情況下不存在「多字典」集合。這就是說,如果你有一個IEnumerable,你可以將它轉換爲查找,就像你所描述的一樣,但不能自己構造(必須調用ToLookup()來從枚舉中創建)。

0

對於您的價值,您可以存儲您想要保存的任何列表。

4

在C++中,這樣的集合被稱爲multimap。對於長期快速搜索發現此相關的問題:

multimap in .NET

8

在.NET 3.5及以上版本中,即ILookup<TKey,TValue>。不幸的是,只有提供的實現是不可變的Lookup<TKey,TValue>,但它很容易重新實現。 MiscUtil包含EditableLookup<TKey,TValue>

隨着ILookup<TKey,TValue>,該TKey索引返回IEnumerable<TValue>(即使沒有該鍵的比賽),所以典型的用法是:

foreach(var value in lookup[key]) 
    DoSomethingWith(value); 
相關問題