【问题标题】: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 如何检查字典中的重复键?

标签: c# string dictionary key text-files


【解决方案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);
      

      【讨论】:

      【解决方案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; 更新您的答案。
      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 2011-04-16
      • 2019-02-14
      • 2013-09-28
      • 1970-01-01
      • 2017-11-05
      • 2017-12-17
      • 1970-01-01
      相关资源
      最近更新 更多