.NET基类库中是否存在允许使用重复键的字典类?我找到的唯一解决方案是创建,例如,一个类:

Dictionary<string, List<object>>

但实际上用起来很烦人。在Java中,我相信MultiMap可以实现这一点,但在. net中找不到类似的东西。


当前回答

我无意中发现了这篇文章,想要寻找相同的答案,但没有找到,所以我使用字典列表构建了一个简单的示例解决方案,当所有其他字典都有给定的键(set)时,重写[]操作符向列表中添加一个新字典,并返回一个值列表(get)。 它既丑陋又低效,它只通过键获取/设置,并且总是返回一个列表,但它是有效的:

 class DKD {
        List<Dictionary<string, string>> dictionaries;
        public DKD(){
            dictionaries = new List<Dictionary<string, string>>();}
        public object this[string key]{
             get{
                string temp;
                List<string> valueList = new List<string>();
                for (int i = 0; i < dictionaries.Count; i++){
                    dictionaries[i].TryGetValue(key, out temp);
                    if (temp == key){
                        valueList.Add(temp);}}
                return valueList;}
            set{
                for (int i = 0; i < dictionaries.Count; i++){
                    if (dictionaries[i].ContainsKey(key)){
                        continue;}
                    else{
                        dictionaries[i].Add(key,(string) value);
                        return;}}
                dictionaries.Add(new Dictionary<string, string>());
                dictionaries.Last()[key] =(string)value;
            }
        }
    }

其他回答

如果你使用的是。net 3.5,使用Lookup类。

编辑:通常使用Enumerable.ToLookup创建Lookup。这确实假设你不需要更改它之后-但我通常发现这已经足够好了。

如果这对你不起作用,我不认为框架中有任何东西可以帮助-使用字典是最好的:(

这也是可能的:

Dictionary<string, string[]> previousAnswers = null;

这样,我们就有了唯一的键。希望这对你有用。

我认为List<KeyValuePair<object object>>可以完成任务。

重复的键将破坏Dictionary的整个契约。在字典中,每个键都是唯一的,并映射到单个值。如果您想要将一个对象链接到任意数量的其他对象,最好的方法可能是类似于DataSet的东西(通常的说法是表)。把键放在一列,值放在另一列。这比字典要慢得多,但这是为了失去散列键对象的能力而付出的代价。

你是说完全一致而不是完全重复吗?否则哈希表将无法工作。

同余意味着两个单独的键可以哈希到等价的值,但键不相等。

例如:假设你的哈希表的哈希函数是hashval = key mod 3。1和4都映射到1,但是是不同的值。这就是列表的概念发挥作用的地方。

当需要查找1时,该值被哈希为1,遍历列表,直到找到Key = 1。

如果允许插入重复的键,则无法区分哪些键映射到哪些值。