是否有一个带有键/值对的通用集合,其中键可以出现多次?

发布于 2024-10-19 18:19:02 字数 161 浏览 2 评论 0 原文

我想使用像 Dictionary 这样的通用集合,但是 Dictionary 要求每个键都是唯一的。我对同一个“键”有多个值,因此我需要一个允许这样做的通用集合。

我意识到这使得不再是真正的键,但我不知道还能称呼它什么。

I want to use a generic collection like Dictionary, but Dictionary requires that every key be unique. I have multiple values for the same "key", so I need a generic collection that will allow for that.

I realize that this makes the key no longer really a key, but I don't know what else to call it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

稀香 2024-10-26 18:19:02

您可以考虑的几个选项:

  • 使用 Dictionary> — 为每个键保留一个值列表不防止重复< /strong> 相同键的值(即重复对);
  • 使用 Dictionary> — 为每个键保留一组值,防止同一键出现重复值 ;
  • 使用 List> — 保留对列表,不防止重复同一键的值。

请注意,在后一种情况下,KeyValuePair 是一个struct,而不是一个class,因此这意味着处理方式有所不同。

正确的选项取决于您的实际用例。

Several options for you to consider:

  • use a Dictionary<TKey, List<TValue>> — keep a list of values for each key, not preventing duplicate values for the same key (i.e. duplicate pairs);
  • use a Dictionary<TKey, HashSet<TValue>> — keep a set of value for each key, preventing duplicate values for the same key;
  • use a 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 a struct, not a class, hence that implies a bit different handling.

The right option depends on your actual use case.

删除会话 2024-10-26 18:19:02

在 .NET 3.5 及更高版本中,即 ILookup。不幸的是,唯一提供的实现是不可变的 Lookup,但它很容易重新实现。 EditableLookup 包含在 MiscUtil 中。

使用 ILookupTKey 索引器返回 IEnumerable(即使该键没有匹配项) ,所以典型用法是:

foreach(var value in lookup[key])
    DoSomethingWith(value);

In .NET 3.5 and above, that is ILookup<TKey,TValue>. Unfortunately the only provided implementation is the immutable Lookup<TKey,TValue>, however it is easy to re-implement. An EditableLookup<TKey,TValue> is included in MiscUtil.

With an ILookup<TKey,TValue>, the TKey indexer returns an IEnumerable<TValue> (even if there were no matches for that key), so typical usage is:

foreach(var value in lookup[key])
    DoSomethingWith(value);
段念尘 2024-10-26 18:19:02

在 C++ 中,这样的集合称为多重映射。快速搜索该术语揭示了这个相关问题:

.NET 中的多重映射

In C++, such a collection is called a multimap. A quick search for that term revealed this related question:

multimap in .NET

沉溺在你眼里的海 2024-10-26 18:19:02

您可以创建一个 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).

泼猴你往哪里跑 2024-10-26 18:19:02

尝试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.

疏忽 2024-10-26 18:19:02

为了您的价值,您可以存储您想要保留的任何内容的列表。

For your value, you could store a list of whatever it is you want to hold.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文