2011-03-02 35 views
8

我想使用像Dictionary这样的通用集合,但Dictionary要求每个密钥都是唯一的。我有相同的“关键”的多个值,所以我需要一个通用的集合,将允许。是否有一个带键/值对的泛型集合,其中的键可以多次出现?

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

+1

对于任何人谁在乎,我最终只是其中一个参考我想在值对象内跟踪的值。然后我使用List ,并能够通过我的对象中的propery访问该值。感谢所有回答的人。我将在未来使用这些信息。 – richard 2011-03-02 22:52:32

+0

可能重复的[在.NET字典中的重复键?](http://stackoverflow.com/questions/146204/duplicate-keys-in-net-dictionaries) – nawfal 2013-11-05 07:32:34

回答

16

几个选项供您参考:

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

注意,在后一种情况下KeyValuePairstruct,而不是一个class,因此暗示有点不同的处理。

正确的选项取决于您的实际使用情况。

+0

我认为你的第二个建议对我最有意义。这将允许我遍历键并获取值,但不要求键在整个集合中是唯一的。那是对的吗? – richard 2011-03-02 22:35:46

+0

是的,这是正确的。另请注意,它不会阻止存储重复对。如果这是一个问题,使用HashSet的第一种方法会更好。 (编辑我的回答覆盖。) – 2011-03-02 22:38:49

+1

好的答案! :-) – 2011-03-02 22:50:28

0

尝试Dictionary<KeyType,List<ValueType>>

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

+0

字典将需要_KeyType_是唯一的。我想多次使用相同的键值。 – richard 2011-03-02 22:32:52

2

您可以创建一个Dictionary<TKey,List<TValue>>并自己完成手动工作,但默认情况下不存在“多字典”集合。这就是说,如果你有一个IEnumerable,你可以将它转换为查找,就像你所描述的一样,但不能自己构造(必须调用ToLookup()来从枚举中创建)。

0

对于您的价值,您可以存储您想要保存的任何列表。

4

在C++中,这样的集合被称为multimap。对于长期快速搜索发现此相关的问题:

multimap in .NET

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); 
相关问题