【问题标题】:How can I resolve "Item has already been added. Key in dictionary:" errors?如何解决“项目已添加。在字典中键入:”错误?
【发布时间】:2011-10-03 06:44:37
【问题描述】:

我有一个应用程序在我尝试向其添加项目时被挂断。当我检查跟踪文件时,我得到了这个条目:

   for (int i=0; i<objects.Count; i++) 
   {
      DataModelObject dmo = (DataModelObject)objects.GetAt(i);
      sl.Add(dmo.Guid, dmo);
   }

}

我不知道如何解决这个问题。

【问题讨论】:

  • 什么是sl?我猜是一个 SortedList 对象?

标签: c# dictionary exception sortedlist


【解决方案1】:

问题在于,在排序列表中,每个键都必须是唯一的。因此,您需要检查您是否没有两次插入相同的键(guid 值)。代码如下:

 for (int i=0; i<objects.Count; i++) 
 {        
    DataModelObject dmo = (DataModelObject)objects.GetAt(i);

    if (!sl.ContainsKey(dmo.Guid))
    {
        sl.Add(dmo.Guid, dmo);
    }
 }

这将确保每个键都是唯一的。但是,如果您期望每个键有多个值,那么您需要使用不同类型的集合。

【讨论】:

  • 我正在测试这个,到目前为止没有问题,但你告诉“如果你期望每个键有多个值,那么你需要使用不同类型的集合”你能澄清一下吗.我的问题开始时我在我的跟踪错误中提到了“字典中的键:'7d210e02-176e-4910-a8aa-0a8606ec95cc' 正在添加的键:'7d210e02-176e-4910-a8aa-0a8606ec95cc'”
  • 我的意思是,如果您有两个具有相同 guid 的 DataModelObject,这是否意味着它们是相同的 DataModelObject?如果是这样,那么上面的代码就可以了。
  • 你是对的,我还有一个问题,以前的代码会使任何应用程序挂起?或挂起是由于其他原因??
  • 如果您没有 if 语句来检查密钥的存在(因为您没有),那么我想如果您没有捕捉到抛出的异常,您的应用程序可能会挂起。我在上面发布的代码不会导致您的应用程序挂起,所以如果它仍然挂起,那是因为其他原因。如果此答案解决了您的问题,请您接受。
【解决方案2】:

异常表明您将相同的key 添加到您的dictionary 两次,要解决此问题,您可以首先确保传递给函数的DataModelCollection objects 具有唯一的Key 值(在您的情况下是Guid 数据类型)dmo.Guid

【讨论】:

  • 您现在可以调试或投入生产吗?
  • 当我重新启动服务时问题消失了,现在我可以添加没有挂起的对象。用于测试调试器本身没有达到“SatisfyGRs”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多