我想使用像Dictionary
這樣的通用集合,但Dictionary
要求每個密鑰都是唯一的。我有相同的「關鍵」的多個值,所以我需要一個通用的集合,將允許。是否有一個帶鍵/值對的泛型集合,其中的鍵可以多次出現?
我意識到這使得鍵不再是一個真正的關鍵,但我不知道還有什麼可以稱它的。
我想使用像Dictionary
這樣的通用集合,但Dictionary
要求每個密鑰都是唯一的。我有相同的「關鍵」的多個值,所以我需要一個通用的集合,將允許。是否有一個帶鍵/值對的泛型集合,其中的鍵可以多次出現?
我意識到這使得鍵不再是一個真正的關鍵,但我不知道還有什麼可以稱它的。
幾個選項供您參考:
Dictionary<TKey, List<TValue>>
- 保持每個值的列表鍵,不會阻止重複值爲相同的密鑰(即重複對);Dictionary<TKey, HashSet<TValue>>
- 保持設定的值爲每個鍵,防止重複值對於相同的密鑰;List<KeyValuePair<TKey, TValue>>
- 保留一個對的列表,不阻止同一個鍵的重複值值。注意,在後一種情況下KeyValuePair
爲struct
,而不是一個class
,因此暗示有點不同的處理。
正確的選項取決於您的實際使用情況。
我認爲你的第二個建議對我最有意義。這將允許我遍歷鍵並獲取值,但不要求鍵在整個集合中是唯一的。那是對的嗎? – richard 2011-03-02 22:35:46
是的,這是正確的。另請注意,它不會阻止存儲重複對。如果這是一個問題,使用HashSet的第一種方法會更好。 (編輯我的回答覆蓋。) – 2011-03-02 22:38:49
好的答案! :-) – 2011-03-02 22:50:28
嘗試Dictionary<KeyType,List<ValueType>>
。
您可以創建自定義詞典,該詞典包裝此詞典以處理添加和刪除時所需的所有邏輯。
字典將需要_KeyType_是唯一的。我想多次使用相同的鍵值。 – richard 2011-03-02 22:32:52
您可以創建一個Dictionary<TKey,List<TValue>>
並自己完成手動工作,但默認情況下不存在「多字典」集合。這就是說,如果你有一個IEnumerable,你可以將它轉換爲查找,就像你所描述的一樣,但不能自己構造(必須調用ToLookup()來從枚舉中創建)。
對於您的價值,您可以存儲您想要保存的任何列表。
在C++中,這樣的集合被稱爲multimap。對於長期快速搜索發現此相關的問題:
在.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);
對於任何人誰在乎,我最終只是其中一個參考我想在值對象內跟蹤的值。然後我使用List,並能夠通過我的對象中的propery訪問該值。感謝所有回答的人。我將在未來使用這些信息。 –
richard
2011-03-02 22:52:32
可能重複的[在.NET字典中的重複鍵?](http://stackoverflow.com/questions/146204/duplicate-keys-in-net-dictionaries) – nawfal 2013-11-05 07:32:34