是否存在具有键/值对的通用集合,其中键可以多次出现?

时间:2011-03-02 22:25:40

标签: .net dictionary generic-collections

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

我意识到这使得不再是真正的关键,但我不知道还有什么可以称之为。

6 个答案:

答案 0 :(得分:18)

您可以考虑几个选项:

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

请注意,在后一种情况下,KeyValuePairstruct,而不是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 ++中,这样的集合称为多图。快速搜索该术语揭示了这个相关问题:

  

multimap in .NET

答案 3 :(得分:2)

您可以创建Dictionary<TKey,List<TValue>>并自行完成手册,但默认情况下没有“多字典”集合。

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

答案 4 :(得分:0)

尝试Dictionary<KeyType,List<ValueType>>

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

答案 5 :(得分:0)

对于您的价值,您可以存储您想要持有的任何内容的列表。