具有重复键的字典 [重复]

Posted

技术标签:

【中文标题】具有重复键的字典 [重复]【英文标题】:Dictionary with duplicate Key [duplicate] 【发布时间】:2012-10-22 11:46:08 【问题描述】:

可能重复:Is there an alternative to Dictionary/SortedList that allows duplicates?

我正在寻找可以有重复键的字典类。

我搜索了一下,发现 LookUp 类可以用来存储重复键,但是它没有默认构造函数,所以我们无法在没有任何其他对象的情况下对其进行初始化。

但是我最初没有任何这样的对象,我可以从中初始化一个 LookUp 对象。

所以,我的问题是,.Net framework 3.5 中是否有任何类,其行为类似于 Dictionary,但允许我拥有像 LookUp 这样的重复键?

【问题讨论】:

请问您为什么想要复制密钥?您可以将数组存储为您的值。 @Marc-AndréJutras,是的,我想存储用户操作及其受影响的内容,因此,我可以对这些受影响的对象执行类似合并的操作。我可以一个一个地执行此操作,但它很耗时,所以我只是存储这些,然后一次性执行,因此只有该操作需要时间,而不是全部。 Dictionary<K,List<V>>代替Dictinary<K,V>怎么样,类似于查找? @YograjGupta:那为什么是字典呢?字典可以快速搜索键。如果您不打算这样做,那就没有意义了,您可以只使用 List> @LB,我目前的实现是使用Dictionary<NetworkAction, Dictionary<NetworkContent, object>> _actionMapping,但我可以多次执行单个操作。 【参考方案1】:

您可以创建一个键值对列表。

List<KeyValuePair<string,int>>

【讨论】:

但是从逻辑上讲,它不是字典,它只是对的列表。 (这很可能是他需要/想要的,我只是技术性的。) 但是密钥检索会受到影响。字典旨在快速进行关键研究。 是的,但我不确定您如何拥有允许重复键并保持字典优势的东西。看起来他应该使用带有值列表的字典,以便在复制键时,将第二个值添加到列表中,并在查找键时检索两者。 [编辑:Servy 在他的回答中所说的话,提高了他的回答] True, but I'm not sure how you could have something that allows duplicate keys and keeps the advantages of a dictionary. 你不能(技术上)。正如我在回答中所说,根据定义,这是不可能的。 @Servy 没错。我没有马上看到你的答案,但它也是我会选择的。我试图直接回答他的问题,但您提供了更好的解决方案。【参考方案2】:

根据定义,字典永远不能有多个具有相同值的键。 (如果您查找一个键,您会返回什么?)即使是您所指的查找,也不允许它。你可以做的是让每个键引用多个值(逻辑上,而不是技术上)。这是通过有一个字典来完成的,其中的值是某种数据结构(例如,List),其中包含与该特定键对应的所有值。

【讨论】:

这类似于 Ninject 的 MultiMap 我一直使用Dictionary&lt;int, List&lt;string&gt;&gt;(或类似的)。 @khillang 是的,这只是 Dictionary&lt;K, List&lt;V&gt;&gt; 的包装;它实际上并没有为你做那么多,但它做了一点。通常我发现直接使用Dictionary&lt;T, List&lt;V&gt;&gt; 很简单,正如 Bobson 提到的那样。 @Servy,感谢您的帮助,我知道 Dictionary 和 LookUp 了解我们使用它们的用途和原因,但我想获得顺序查找。【参考方案3】:

您可以使用列表字典Dictionary&lt;TKey, List&lt;TValue&gt;&gt;自己编写类型

您可以创建一个从该类继承的类,并添加合适的添加方法等来处理为给定键上的第一项创建新列表。

【讨论】:

你知道 - 我一直使用这种结构,但我从未想过要创建一个类来处理它。我做了一些扩展方法,但不是一个类。好主意。

以上是关于具有重复键的字典 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将具有重复键的 2 个字典与 linq 合并

如何将在多行中具有相同键的字典转换为数据框[重复]

包含具有重复值的字典的字典组数组

在字典中查找重复值并打印重复元素的键

具有多个值的C#字典如何[重复]

具有相同键的(嵌套)字典的 Pythonic 替代方案?