我想使用一个通用集合Dictionary
,但Dictionary
要求每个键都是唯一的。我对同一个“键”有多个值,所以我需要一个允许这样做的通用集合。
我意识到这使得钥匙不再是真正的钥匙,但我不知道还能叫它什么。
我想使用一个通用集合Dictionary
,但Dictionary
要求每个键都是唯一的。我对同一个“键”有多个值,所以我需要一个允许这样做的通用集合。
我意识到这使得钥匙不再是真正的钥匙,但我不知道还能叫它什么。
几个选项供您考虑:
Dictionary<TKey, List<TValue>>
保留一个值列表,而不是防止相同键的重复值(即重复对);Dictionary<TKey, HashSet<TValue>>
保留一组值,防止同一键出现重复值;List<KeyValuePair<TKey, TValue>>
- 保留对列表,不防止相同键的重复值。请注意,在后一种情况下KeyValuePair
是 a struct
,而不是 a class
,因此这意味着处理方式有所不同。
正确的选择取决于您的实际用例。
在 .NET 3.5 及更高版本中,即ILookup<TKey,TValue>
. 不幸的是,唯一提供的实现是不可变的Lookup<TKey,TValue>
,但是它很容易重新实现。AnEditableLookup<TKey,TValue>
包含在MiscUtil中。
使用 an ILookup<TKey,TValue>
,TKey
索引器返回 an IEnumerable<TValue>
(即使该键没有匹配项),因此典型用法是:
foreach(var value in lookup[key])
DoSomethingWith(value);
在 C++ 中,这样的集合称为多重映射。对该术语的快速搜索揭示了这个相关问题:
您可以自己创建Dictionary<TKey,List<TValue>>
并进行手动工作,但默认情况下没有“多字典”集合。
也就是说,如果您有一个 IEnumerable,您可以将其转换为类似于您所描述的查找,但不能自行构造(必须调用 ToLookup() 才能从枚举创建)。
试试Dictionary<KeyType,List<ValueType>>
。
您可以创建一个自定义字典来包装此字典,以便在添加和删除时处理所有必需的逻辑。
为了您的价值,您可以存储您想要持有的任何内容的列表。