#c_sharp #коллекции #итераторы
В коллекцию постоянно добавляются сообщения об изменении в программе и мне нужно выводить эти изменения в textbox. Для этого использую метод Print, где получаю строку для вывода. class Journal { // Коллекция для событий private Listjournal = new List (); // Добавить событие в коллекцию public void Add(string Name, string Type_of_Change) { journal.Add(new CollectionHandlerEventArgs(Name, Type_of_Change)); } // Обработчик изменений на сервере public void ServerChanged(CollectionHandlerEventArgs e) { CollectionHandlerEventArgs je = new CollectionHandlerEventArgs(e.Name, e.Type_of_Change); journal.Add(je); } // Обработчик изменений клиента public void ClientChanged(CollectionHandlerEventArgs e) { CollectionHandlerEventArgs je = new CollectionHandlerEventArgs(e.Name, e.Type_of_Change); journal.Add(je); } // Получение строки с изменениями public string Print() { string s = null; foreach (CollectionHandlerEventArgs j in journal) { s += j.Name + ": " + j.Type_of_Change + "\n"; } return s; } } Нашел ошибку в том, что во время итерации нельзя изменять коллекцию, однако мне необходимо это сделать. Как исправить?
Ответы
Ответ 1
Ошибка вызвана изменениями в списке в то время, когда существует энумератор этого списка. В цикле for никакого энумератора не создается. for (int i = 0; i < journal.Count; i++) { CollectionHandlerEventArgs item = journal[i]; s += item.Name + ": " + item.Type_of_Change + "\n"; } Потоко-безопасный вариант: private ConcurrentBagjournal = new ConcurrentBag (); ... foreach (CollectionHandlerEventArgs j in journal.ToArray()) { s += j.Name + ": " + j.Type_of_Change + "\n"; }
Комментариев нет:
Отправить комментарий