如何将重复键添加到字典中

Posted

技术标签:

【中文标题】如何将重复键添加到字典中【英文标题】:How to add duplicate keys into the Dictionary 【发布时间】:2014-04-13 09:25:12 【问题描述】:

我有一些文本文件中的行要添加到字典中。我是第一次使用字典。添加起始行时没问题,但突然出现错误:

已添加具有相同密钥的项目

在我的代码中有重复的键,我无法更改。这是我在 c# 中的代码

Dictionary<string, string> previousLines = new Dictionary<string, string>  ;
previousLines.Add(dialedno, line);

这里 dialedno 是键,line 是文本文件行。 这是我根据键检索给定行的代码。

string tansferOrginExt = previousLines[dialedno];

所以我关心的是如果可能的话,如何允许在字典中添加重复的键,如果不能,我如何获得类似的功能。

【问题讨论】:

正如其他人所说,不可能在字典中添加重复键。使用 Dictionary> 怎么样?然后检查该键是否存在,然后在该键的列表值中添加该行,如果该键不存在,则在字典中创建一个新条目。 @samar 如何检查字典中的重复键? Duplicate keys in .NET dictionaries?的可能重复 【参考方案1】:

如何允许在字典中添加重复键

这是不可能的。所有键都应该是唯一的。正如Dictionary&lt;TKey, TValue&gt; 实现的那样:

aDictionary&lt;TKey, TValue&gt; 中的每个键都必须是唯一的,根据 字典的相等比较器。

可能的解决方案 - 您可以将字符串集合保留为值(即使用 Dictionary&lt;string, List&lt;string&gt;&gt;),或者(更好)您可以使用 Lookup&lt;TKey, TValue&gt; 而不是字典。


如何检查重复键并从中删除以前的值 字典?

您可以使用previousLines.ContainsKey(dialedno) 检查该键是否存在,但如果您总是想保留最后一行,则只需替换该键的任何字典,或者如果字典中不存在则添加新键:

previousLines[dialedno] = line;

【讨论】:

如何检查重复键并从字典中删除以前的值? @Ram 查看更新的解决方案。您还可以使用 Linq 仅从最后一个值创建字典 请注意,查找没有实现 ICollection。所以没有AddRemoveClearContainsCopyTo 方法。或Count 属性。 为什么不直接使用 'previousLines[dialedno] = line' 而不检查 ContainsKey? @RobHinchliff 101% 同意你的看法【参考方案2】:

我们可以使用键值对列表

List<KeyValuePair<string, string>> myduplicateLovingDictionary= new List<KeyValuePair<string, string>>();
KeyValuePair<string,string> myItem = new KeyValuePair<string,string>(dialedno, line);
myduplicateLovingDictionary.Add(myItem);

【讨论】:

【参考方案3】:

不可能将重复项添加到字典中 - 另一种方法是使用 Lookup 类。

Enumerable.ToLookup Method

从 IEnumerable 创建通用查找。

【讨论】:

注意这个类没有实现ICollection【参考方案4】:

例子:

class Program
        
             private static List<KeyValuePair<string, int>> d = new List<KeyValuePair<string, int>>();

            static void Main(string[] args)
            
                 d.Add(new KeyValuePair<string, int>("joe", 100));
                 d.Add(new KeyValuePair<string, int>("joe", 200));
                 d.Add(new KeyValuePair<string, int>("jim", 100));
                 var result = d.Where(x => x.Key == "joe");
                foreach(var q in result)
                    Console.WriteLine(q.Value   );
                Console.ReadLine();
            
         

【讨论】:

【参考方案5】:
List< KeyValuePair < string, string>> listKeyValPair= new List< KeyValuePair< string, string>>();
KeyValuePair< string, string> keyValue= new KeyValuePair< string, string>("KEY1", "VALUE1");
listKeyValPair.Add(keyValue);

【讨论】:

这与this answer中的代码几乎相同【参考方案6】:

如果您的问题是是否可以两次添加相同的键,答案是否定的。 但是,如果您只想遍历项目,然后增加特定 Key 的值的计数,则可以使用“TryAdd”方法来实现。

var dict = new Dictionary<int, int>();
        foreach (var item in array)
        
            dict.TryAdd(item, 0);
            dict[item]++;
        

我们试图用 if else 实现的同样的事情,可以用这个方法来实现。``

https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2.tryadd?view=netframework-4.7.2

【讨论】:

这个磨损无济于事,因为dict 仍然有唯一的键。考虑根据问题Dictionary&lt;string, string&gt; 更新您的答案。

以上是关于如何将重复键添加到字典中的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个值添加到python中的字典键? [关闭]

Python:创建后冻结字典键[重复]

如何以编程方式将字符串和键添加到 iPhone 中的字典?

如何根据密钥是否已存在更新我的字典? [重复]

按字母顺序排列的字典键[重复]

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