【问题标题】:The Collection has modified, the enumeration operation may not executeCollection 已修改,枚举操作可能无法执行
【发布时间】:2019-01-19 12:56:16
【问题描述】:

我有一本字典,我想通过删除前一个字典并添加一个新字典来修改其中的键,然后一次又一次地对其进行迭代。 这是字典的声明

   Dictionary<string, List<Entity>> SuggestedDictionary = new Dictionary<string, List<Entity>>

并且:另一个字典是:

   Dictionary<string, List<Entity>> CopyDataDict = new Dictionary<string, List<Entity>>

之后,我使用 Dict.Add() 在字典中填充数据。

List<Entity> list = db.books.ToList();
foreach(var l in list)
{
   list.Add(l);
}
SuggestedDictionary.Add("Key", list);
CopyDataDict.Add("Key", list); 

然后我遍历数据如下:

foreach (var entry in CopyDataDict.Values.ToList())
{
    for (int i = 2; i < 15; i++) //just 14 items will be added
    {
        foreach (var container in SuggestedDictionary.Keys)
        {
            rec.Add(new Recommendations() { bookName = container, Rate = CalculatePearsonCorrelation(bkName, container) });
        }


        SuggestedDictionary.Remove(SuggestedDictionary.Keys.ToString());


        if (!SuggestedDictionary.ContainsKey(entry[i].bookName))
        {
            SuggestedDictionary.Add(entry[i].bookName, list);
        }
    }

当我运行代码时,它说集合已被修改,枚举运算符可能无法执行。我该如何解决它,或者有更好的解决方案来做同样的事情。

【问题讨论】:

标签: c# dictionary collections key enumeration


【解决方案1】:

我只是运行了您的代码,它与添加或删除密钥无关。填充列表对象时出现错误

List<Entity> list = db.books.ToList();
foreach(var l in list)
{
   list.Add(l);
}

您已经有了一个书籍列表,那么 foreach 循环的目的是什么?

您收到错误是因为您在枚举列表时添加了新对象,这是不允许的,因为它是不定式

【讨论】:

    【解决方案2】:

    您的问题始于以下代码:

    List<Entity> list = new DomainModelDbContext().books.ToList();
    
    foreach (var l in list)
    {
        list.Add(l); // Runtime error
    }
    

    一般来说,您不能在使用 foreach 循环对其进行迭代时添加或删除集合或字典中的项目。如果您使用其他类型的循环,例如 for(...)、while 循环等,则不会出现此问题。

    【讨论】:

    • 是的,我明白了,我一次又一次地循环,现在我的代码运行良好。但事实上,查询需要很长时间才能执行。有没有更聪明的方法。
    • 你的代码的哪一行是慢的?它从数据库中获取了多少条记录?
    • 不是一个大问题,我使用 Take(num) 限制了结果。事实上,我有大约一万一万条记录,我正在使用核心 i5。这就是查询缓慢的原因。
    猜你喜欢
    • 2011-09-04
    • 2016-06-06
    • 1970-01-01
    • 2021-02-25
    • 2012-04-01
    相关资源
    最近更新 更多