【问题标题】:An item with the same key has already been added c# error已添加具有相同键的项目 c# 错误
【发布时间】:2010-10-25 20:38:00
【问题描述】:
foreach (Benefit bene in claim.SubClaimFolderCollection[0].BenefitsFolder.BenefitCollection) 
{
    Dictionary<string, object> searchBeneficiary = 
        new Dictionary<string,object>();

     searchBeneficiary.Add("rli_beneficiariesid", ((Guid)claimant.GetValue("rli_subclaimfolderid", true)));     
}

它给了我这个错误

在向字典中添加项目时,已经添加了具有相同键的项目。

【问题讨论】:

  • 在我的项目中没有这样的字典,如果你注意到我已经用 new 初始化了它,所以应该没有任何东西
  • 您确定您发布了正确的代码吗?
  • 您能解释一下您要达到的目标吗?在 foreach 循环中声明 Dictionary 看起来很奇怪,因为每次循环迭代都会有效地清除它。但是,无法理解为什么您在上面的代码中已经添加了密钥。
  • 我很想看看SubClaimFolderCollection[0].GetValue 方法在做什么。
  • 是的,我知道这很奇怪,我已经和这个作斗争了将近一个小时

标签: c# dictionary


【解决方案1】:

您确定错误来自这里吗?看起来对于每次迭代,您都在创建一个新字典,向其中插入一个条目,然后丢弃该字典。这不应该给出这个错误,而且它也不太可能是你想要做的。

如果您想将集合转换为字典,我建议使用 Enumerable.ToDictionary 方法(需要 .NET 3.5)。

【讨论】:

  • 这就是我的想法,应该没有任何问题,它实际上并没有给出任何错误,而是运行时异常。
  • @Ashutosh:您确定您发布的代码是给出错误的代码吗?你能发布完整的堆栈跟踪吗?
  • 对不起,我不能发布整个代码,但是错误仅来自这一行,我通过快速观察看到了它。另外,我没有在我的项目中的其他任何地方使用这个词典跨度>
  • 如果您不在其他任何地方使用字典,为什么不直接删除代码?反正它没有做任何有用的事情。
  • 但问题是,如果字典每次都被重置,你不是在执行不必要的操作吗?另外,字典在 for 循环的范围内,因此您无法在其他任何地方访问它。如果这实际上是您的代码的样子,您怎么可能使用地图?
【解决方案2】:

在我看来,“rli_beneficiariesid”键每次通过循环都被添加到字典中两次:

(从原始帖子中的当前代码示例复制和粘贴的代码):

searchBeneficiary.Add( 
        "rli_beneficiariesid",  
        searchBeneficiary.Add("rli_beneficiariesid", ((Guid)claimant.GetValue("rli_subclaimfolderid", true)));    

请注意,searchBeneficiary.Add 是用“rli_beneficiariesid”调用的。在 Add 调用中,再次使用相同的键调用 searchBeneficiary.Add。

最终的效果似乎是一个 guid (claimant.GetValue) 被添加到 searchBeneficiary 字典中,使用“rli_beneficiariesid”键,然后字典被添加到自身,使用相同的键!

【讨论】:

    【解决方案3】:

    这里似乎不能出现错误:将一对添加到空字典中...请给出异常的完整堆栈跟踪。

    【讨论】:

    • StackTrace " 在 System.ThrowHelper.ThrowArgumentException(ExceptionResource 资源)\r\n 在 System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add)\r\n at System.Collections.Generic.Dictionary2.Add(TKey key, TValue value)" 字符串
    • @Ashutosh:您需要提供还包括行号的堆栈跟踪。没有行号的堆栈跟踪不会有太大帮助。尝试在调试模式下运行您的代码。此外,您还需要指定代码示例从哪一行开始,以便我们可以看到堆栈跟踪所指的行。最后,您应该使用此信息更新您的问题,而不是将其发布在 cmets 中。
    【解决方案4】:

    此代码不会导致错误。 :)

    请发布 claimant.GetValue(...) 方法的代码以及它从内部访问的方法/属性(如果有的话)。我想,你可以在这个方法中将 smth 保存到其他字典中。

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多