我想使用像Dictionary
这样的通用集合,但Dictionary
要求每个键都是唯一的。我对同一个“密钥”有多个值,所以我需要一个允许的通用集合。
我意识到这使得键不再是真正的关键,但我不知道还有什么可以称之为。
答案 0 :(得分:18)
您可以考虑几个选项:
Dictionary<TKey, List<TValue>>
- 为每个键保留列表值,不会阻止相同键的重复值(即重复对); Dictionary<TKey, HashSet<TValue>>
- 为每个键保留 set 值,防止重复值为同一个键; List<KeyValuePair<TKey, TValue>>
- 保留一对配对列表,不会阻止同一个键的重复值。请注意,在后一种情况下,KeyValuePair
是struct
,而不是class
,因此这意味着处理方式略有不同。
正确的选项取决于您的实际使用情况。
答案 1 :(得分: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);
答案 2 :(得分:4)
在C ++中,这样的集合称为多图。快速搜索该术语揭示了这个相关问题:
答案 3 :(得分:2)
您可以创建Dictionary<TKey,List<TValue>>
并自行完成手册,但默认情况下没有“多字典”集合。
也就是说,如果你有一个IEnumerable,你可以将它转换为类似于你所描述的查找,但不能自己构造(必须调用ToLookup()来从枚举创建)。
答案 4 :(得分:0)
尝试Dictionary<KeyType,List<ValueType>>
。
您可以创建一个自定义词典,它包装此词典以在添加和删除时处理所有必需的逻辑。
答案 5 :(得分:0)
对于您的价值,您可以存储您想要持有的任何内容的列表。