关于c#:Collection已修改,枚举操作可能无法执行

The Collection has modified, the enumeration operation may not execute

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

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

另一本字典是:

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

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

1
2
3
4
5
6
7
List<Entity> list = db.books.ToList();
foreach(var l in list)
{
   list.Add(l);
}
SuggestedDictionary.Add("Key", list);
CopyDataDict.Add("Key", list);

然后我对数据进行如下迭代:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
        }
    }

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


我刚运行了您的代码,这与添加或删除密钥无关。当填充列表对象时会得到错误

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

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

由于在列表上枚举时添加了新对象,因此会出现错误,这是不允许的,因为它将是不定式的。


您的问题从以下代码开始:

1
2
3
4
5
6
List<Entity> list = new DomainModelDbContext().books.ToList();

foreach (var l in list)
{
    list.Add(l); // Runtime error
}

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