Коллекция изменена, операция перечисления может не выполняться - PullRequest
0 голосов
/ 19 января 2019

У меня есть словарь, в котором я хочу изменить ключ, удалив предыдущий и добавив новый, а затем повторив его снова и снова.Вот объявление словаря

   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);
        }
    }

Когда я запускаю код, он говорит, что Коллекция была изменена, оператор перечисления может не выполняться.Как я могу это исправить или есть лучшее решение, чтобы сделать то же самое.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Ваша проблема начинается со следующего кода:

List<Entity> list = new DomainModelDbContext().books.ToList();

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

Вообще говоря, вы не можете добавлять или удалять элементы в коллекции или словаре, повторяя их с помощью цикла foreach. Эта проблема не возникнет, если вы используете циклы другого типа, например for (...), while и т. Д.

0 голосов
/ 19 января 2019

Я только что запустил ваш код, он не имеет ничего общего с добавлением или удалением ключа.Вы получаете сообщение об ошибке, когда заполняете свой объект списка

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

у вас уже есть список книг, так какова цель цикла foreach?

Вы получаете ошибку, потому что добавляетеновые объекты при перечислении по списку, это недопустимо, потому что это будет инфинитив

...