如何将重复键添加到字典中
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如何允许在字典中添加重复键
这是不可能的。所有键都应该是唯一的。正如Dictionary<TKey, TValue>
实现的那样:
a
Dictionary<TKey, TValue>
中的每个键都必须是唯一的,根据 字典的相等比较器。
可能的解决方案 - 您可以将字符串集合保留为值(即使用 Dictionary<string, List<string>>
),或者(更好)您可以使用 Lookup<TKey, TValue>
而不是字典。
如何检查重复键并从中删除以前的值 字典?
您可以使用previousLines.ContainsKey(dialedno)
检查该键是否存在,但如果您总是想保留最后一行,则只需替换该键的任何字典,或者如果字典中不存在则添加新键:
previousLines[dialedno] = line;
【讨论】:
如何检查重复键并从字典中删除以前的值? @Ram 查看更新的解决方案。您还可以使用 Linq 仅从最后一个值创建字典 请注意,查找没有实现 ICollection。所以没有Add
、Remove
、Clear
Contains
或CopyTo
方法。或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<string, string>
更新您的答案。以上是关于如何将重复键添加到字典中的主要内容,如果未能解决你的问题,请参考以下文章