是否有一个带有键/值对的通用集合,其中键可以出现多次?
我想使用像 Dictionary
这样的通用集合,但是 Dictionary
要求每个键都是唯一的。我对同一个“键”有多个值,因此我需要一个允许这样做的通用集合。
我意识到这使得键不再是真正的键,但我不知道还能称呼它什么。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以考虑的几个选项:
Dictionary>
— 为每个键保留一个值列表,不防止重复< /strong> 相同键的值(即重复对);Dictionary>
— 为每个键保留一组值,防止同一键出现重复值 ;List>
— 保留对列表,不防止重复同一键的值。请注意,在后一种情况下,
KeyValuePair
是一个struct
,而不是一个class
,因此这意味着处理方式有所不同。正确的选项取决于您的实际用例。
Several options for you to consider:
Dictionary<TKey, List<TValue>>
— keep a list of values for each key, not preventing duplicate values for the same key (i.e. duplicate pairs);Dictionary<TKey, HashSet<TValue>>
— keep a set of value for each key, preventing duplicate values for the same key;List<KeyValuePair<TKey, TValue>>
— keep a list of pair, not preventing duplicate values for the same key.Note that in the latter case
KeyValuePair
is astruct
, not aclass
, hence that implies a bit different handling.The right option depends on your actual use case.
在 .NET 3.5 及更高版本中,即,但它很容易重新实现。
ILookup
。不幸的是,唯一提供的实现是不可变的 LookupEditableLookup
包含在 MiscUtil 中。使用
ILookup
,TKey
索引器返回IEnumerable
(即使该键没有匹配项) ,所以典型用法是:In .NET 3.5 and above, that is
ILookup<TKey,TValue>
. Unfortunately the only provided implementation is the immutableLookup<TKey,TValue>
, however it is easy to re-implement. AnEditableLookup<TKey,TValue>
is included in MiscUtil.With an
ILookup<TKey,TValue>
, theTKey
indexer returns anIEnumerable<TValue>
(even if there were no matches for that key), so typical usage is:在 C++ 中,这样的集合称为多重映射。快速搜索该术语揭示了这个相关问题:
In C++, such a collection is called a multimap. A quick search for that term revealed this related question:
您可以创建一个
Dictionary>
并自己手动完成工作,但默认情况下没有“多词典”集合。也就是说,如果您有 IEnumerable,您可以将其转换为类似于您所描述的查找,但不能自行构造(必须调用 ToLookup() 从枚举创建)。
You can create a
Dictionary<TKey,List<TValue>>
and do the manual work yourself, but there is no "multi-dictionary" collection by default.That said, if you have an IEnumerable you can convert it to a lookup which is like what you described, but can't be constructed by itself (have to call ToLookup() to create from enumeration).
尝试
Dictionary>
。您可以创建一个自定义字典来包装该字典以处理添加和删除时所需的所有逻辑。
Try
Dictionary<KeyType,List<ValueType>>
.You can create a custom dictionary which wraps this dictionary to handle all the required logic upon adding and removing.
为了您的价值,您可以存储您想要保留的任何内容的列表。
For your value, you could store a list of whatever it is you want to hold.