【问题标题】:Is there a generic collection with a key/value pair where key can occur more than once?是否存在具有键/值对的通用集合,其中键可以多次出现?
【发布时间】:2011-07-07 15:43:04
【问题描述】:

我想使用像Dictionary 这样的通用集合,但Dictionary 要求每个键都是唯一的。我对同一个“键”有多个值,所以我需要一个通用的集合来支持它。

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

【问题讨论】:

  • 对于任何关心的人,我最终只是在值对象中包含了对我想要跟踪的值的引用。然后我只使用了一个 List 并且能够通过我的对象中的属性访问该值。感谢所有回答的人。我将使用此信息以备将来使用。

标签: .net dictionary generic-collections


【解决方案1】:

试试Dictionary<KeyType,List<ValueType>>

您可以创建一个自定义字典来包装此字典,以便在添加和删除时处理所有必需的逻辑。

【讨论】:

  • 字典将要求 KeyType 是唯一的。我想多次为键使用相同的值。
【解决方案2】:

您可以创建一个Dictionary<TKey,List<TValue>> 并自己做手工,但默认情况下没有“多字典”集合。

也就是说,如果您有一个 IEnumerable,您可以将其转换为与您描述的类似的查找,但不能自行构造(必须调用 ToLookup() 从枚举创建)。

【讨论】:

    【解决方案3】:

    为了您的价值,您可以存储您想要持有的任何物品的列表。

    【讨论】:

      【解决方案4】:

      在 C++ 中,这样的集合称为多重映射。对该词的快速搜索发现了这个相关的问题:

      multimap in .NET

      【讨论】:

        【解决方案5】:

        您可以考虑几个选项:

        • 使用Dictionary<TKey, List<TValue>> — 为每个键保留一个列表值,不防止重复相同键的值(即重复对);
        • 使用Dictionary<TKey, HashSet<TValue>>——为每个键保留一个集合值,防止重复值为同一个键;
        • 使用List<KeyValuePair<TKey, TValue>> — 保留一对列表,不防止重复相同键的值。

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

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

        【讨论】:

        • 我认为你的第二个建议对我来说最有意义。它允许我遍历键并获取值,但不要求键在集合中是唯一的。对吗?
        • 是的,没错。另请注意,它不会阻止存储重复对。如果这是一个问题,使用HashSet 的第一种方法会更好。 (编辑了我的答案以涵盖这一点。)
        【解决方案6】:

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

        使用ILookup<TKey,TValue>TKey 索引器返回一个IEnumerable<TValue>(即使该键没有匹配项),所以典型用法是:

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

        【讨论】:

          猜你喜欢
          • 2017-04-20
          • 2011-05-13
          • 2016-04-17
          • 2013-10-13
          • 2013-02-18
          • 2016-05-20
          • 2010-12-18
          • 1970-01-01
          • 2018-10-06
          相关资源
          最近更新 更多