我想使用像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