#c_sharp #коллекции #итераторы
В коллекцию постоянно добавляются сообщения об изменении в программе и мне нужно
выводить эти изменения в textbox. Для этого использую метод Print, где получаю строку
для вывода.
class Journal
{
// Коллекция для событий
private List journal = 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"; }
Комментариев нет:
Отправить комментарий