В c # безопасно ли расширять список, через который проходит foreach? - PullRequest
0 голосов
/ 03 декабря 2011

В c # безопасно ли расширять список, который пересекается с foreach?

Ответы [ 6 ]

4 голосов
/ 03 декабря 2011

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

Вы можете создать новый список и затем добавить AddRange к исходному списку.

1 голос
/ 03 декабря 2011

В c # безопасно ли расширять список, который просматривается с помощью foreach? Если нет, то как насчет других коллекций?

Существует очень мало коллекций, которые позволяют безопасно добавлять их во время итерации. Здесь есть довольно много вариантов. Наиболее распространенным является создание новой коллекции из оригинала или добавление элементов во временную коллекцию во время итерации, а затем добавление их всех в исходную коллекцию в конце.

Единственные коллекции в платформе, которые разработаны с учетом итерации и вставки, - это некоторые из одновременных коллекций. Например, вы можете выполнять итерацию BlockingCollection<T> через GetConsumingEnumerable и одновременно добавлять в нее элементы. Однако это предназначено для другой цели - обычно используется, когда отдельный поток потребителя и производителя добавляется один, а другой обрабатывает элементы. Таким образом, выполнение этого в собственном цикле было бы очень странным вариантом использования.

0 голосов
/ 03 декабря 2011

Просто создайте новый список.Например, с помощью кнопок:

List<Button> list = new List<Button>();
list.Add(new Button());
list.Add(new Button());

foreach (Button button in new List<Button>(list))
    list.Add(new Button());

Не лучшее решение, но, вероятно, самое простое.

0 голосов
/ 03 декабря 2011

Некоторые, возможно, хорошие, некоторые сложные решения здесь. Как насчет циклирования, хотя список с определенным временем, основанным на длине списков и текущей позиции, должен работать?

UInt16 n = 0;
while (n < list.Count)
{
    ... // might add new elements to the end of the list
    n++;
}
0 голосов
/ 03 декабря 2011

foreach предназначен только для просмотра значений любой коллекции, если вы измените количество элементов в коллекции - будет сгенерировано исключение.Если вы будете менять значения в коллекции - ничего не произойдет, но совет Microsoft не использовать foreach для такого случая.Если вам нужно изменить элементы или количество элементов, используйте list.ToArray () и цикл FOR через массив.

0 голосов
/ 03 декабря 2011

Нет, вы получите исключение.Хотя это и не рекомендуется, вы можете выполнить то, что ищете, используя простой цикл for.Причина, по которой вы получаете исключение, заключается в том, как работает foreach.При компиляции он фактически использует IEnumerable<T> или IEnumerable, который реализуется List<T> для получения элементов.Теперь вы можете создать свою собственную коллекцию, которая бы позволяла что-то подобное, но опять же, не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...