【问题标题】:Adding item in dictionary showing an error: an item with the same key has already been added. dictionary在显示错误的字典中添加项目:已添加具有相同键的项目。字典
【发布时间】:2012-02-23 11:03:25
【问题描述】:

我在努力

   Dictionary<int, int> list = new Dictionary<int, int>();

   for (int i = 0; i < IDList.Count; i++)
   {
     list.Add(Convert.ToInt32(Cmd.Parameters["@ReturnVal"].Value.ToString()), IDList[i]);
   }
   return list;

当我添加一个值两次没有错误但第三次显示错误

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

请告诉我如何解决这个问题。

【问题讨论】:

  • 这个问题是关于 Dictionary 还是关于 Cmd.Parameters["@ReturnVal"].Value 的?
  • 你确定Convert.ToInt32(Cmd.Parameters["@ReturnVal"].Value.ToString()) 没有检索到相同的值吗?
  • 是的,它有时会检索相同的值,有时会检索到唯一值

标签: c# asp.net dictionary


【解决方案1】:

假设 #1:

您将您的字典命名为“列表”,这表明您没有使用字典来代替它,而应该使用List&lt;T&gt;

字典要求每个键(Add() 的第一个参数)是唯一的,但是 Cmd.Parameters["@ReturnVal"] 看起来很可疑,就像它是 SqlCommand(或其父类之一)的 Parameters 属性。如果是这样,它将始终在您显示的代码中返回相同的值。

因此,如果您真的想创建一个元组集合,其中第一个值始终是“@ReturnValue”,第二个值是IDList[i],那么您应该改用List&lt;Tuple&lt;int, int&gt;&gt; 之类的东西。

例子:

  List<Tuple<int, int>> list = new List<Tuple<int, int>>();

  for (int i = 0; i < IDList.Count; i++)
  {
    list.Add(
      Tuple.Create(Convert.ToInt32(Cmd.Parameters["@ReturnVal"].Value), IDList[i])
    );
  }

  return list;

假设 #2:

实际上,IDList[i] 值(同样,顾名思义)是唯一值,即您的键,而您只是错误地使用了 Dictionary&lt;TKey,TValue&gt;.Add() 参数。

【讨论】:

  • 当我尝试使用 list.Add( Tuple.Create(Convert.ToInt32(Cmd.Parameters["@ReturnVal"].Value), IDList[i]) );我收到一个错误 Add 方法没有重载需要 1 个参数。我需要添加其他东西吗,请给我解释,因为我从来没有使用过元组
  • 您需要使用 List&lt;Tuple&lt;int, int&gt;&gt; 作为您的类型,正如我在回答中指出的那样。我已经阐明了这个例子。
  • 哦,请注意Tuple 类需要.NET 4.0。但是从您描述的错误来看,我认为您正在使用它。
【解决方案2】:

您必须尝试使用​​Containskey 并在添加之前进行过滤。

if(!list.ContainsKey(key)
{
    list.Add(value,key);
}

【讨论】:

    【解决方案3】:

    Dictionary.Add(…) 按此顺序接受keyvalue,并希望密钥是唯一的。

    如果Cmd.Parameters["@ReturnVal"].Value 的任何结果相同,您的代码将失败。

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 2013-03-18
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      相关资源
      最近更新 更多