重复键的字典

10

可能有重复内容:
是否有允许重复的Dictionary/SortedList替代品?

我正在寻找一种类似于字典(Dictionary)的类,可以拥有重复的键。

我搜索了一下,发现LookUp类可以用来存储重复的键,但是它没有默认构造函数,所以我们不能初始化一个不包含任何其他对象的LookUp对象。

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

因此,我的问题是,在.Net Framework 3.5中是否有像Dictionary那样的类,允许我拥有像LookUp那样的重复键?


7
请问您为什么需要复制的键呢?您可以将一个数组作为值来存储。 - LightStriker
1
使用Dictionary<K,List<V>>来替换Dictinary<K,V>,类似于Lookup,怎么样? - L.B
1
@YograjGupta:那为什么要用字典呢?字典的设计初衷就是快速查找键。如果你不打算这样做,那就没有意义了,你可以使用List<Tuple<MyAction, MyData>>。 - LightStriker
@LB,是的,但它只有一个键作为单个操作。但是,一个操作可以重复多次。我可以创建一个类来执行我想要的所有任务,但我想知道在 .Net Framework 中是否有这样的功能。 - Yograj Gupta
这里的每个人都在说“不行”,总的来说是正确的,但如果你正在存储字符串,那么 .net 有 NameValueCollection。MSDN:该类可以在单个键下存储多个字符串值 - AnorZaken
显示剩余3条评论
3个回答

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

List<KeyValuePair<string,int>>

2
但这样它就不是一个逻辑上的字典了,只是一组键值对列表。(也许这正是他需要的,我只是在技术上指出。) - Servy
但是这样会影响关键字的检索速度。字典的设计初衷就是为了快速查找关键字。 - LightStriker
没错,但我不确定如何实现允许重复键并保持字典优势的功能。看起来他应该使用一个带有值列表的字典,这样当一个键被重复时,第二个值将被添加到列表中,并且在查找键时都会被检索出来。[编辑:Servy在他的答案中所说的,提高了他的答案] - madeFromCode
“没错,但我不确定如何实现既允许重复键又保留字典优势的功能。” 从技术上讲是不可能的。正如我在答案中所说,这是根据定义来判断的。 - Servy
@Servy 没错。我没有立即看到您的答案,但这也是我会选择的答案。我试图直接回答他的问题,但您提供了更好的解决方案。 - madeFromCode

12

根据定义,字典永远无法具有相同值的多个键。 (如果您查找一个键,您将返回什么?)即使是您提到的查找,也不允许这样做。您可以做的是每个键都指向多个值(在逻辑上而非技术上)。这可以通过创建一个字典,其值是某种数据结构(例如,List),其中包含与该特定键对应的所有值来实现。


1
иҝҷе°Ҷзұ»дјјдәҺNinjectзҡ„MultiMapгҖӮ - khellang
1
我经常使用 Dictionary<int, List<string>>(或类似的结构)。 - Bobson
1
@khellang 是的,这只是一个Dictionary<K,List<V>>的包装器;它并不会为您做太多事情,但确实会有一些帮助。通常我发现直接使用Dictionary<T, List<V>>就足够简单了,正如Bobson所提到的那样。 - Servy
@Servy,感谢您的帮助,我知道Dictionary和LookUp的用途和原因,但我想要获得顺序查找。 - Yograj Gupta

3

您可以通过使用一个列表字典Dictionary<TKey, List<TValue>>来自定义类型。

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


你知道吗 - 我经常使用这种结构,但我从未想过创建一个类来处理它。我做了一些扩展方法,但没有类。好主意。 - Bobson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接