Получение InvalidOperationException при изменении коллекции при ее прохождении по ней - PullRequest
0 голосов
/ 11 сентября 2011

У меня есть коллекция, скажем, список целых чисел и цикл по нему, используя foreach, но если мне нужно вставить данные в список во время цикла, как мне это сделать?Я получаю

Необработанное исключение: System.InvalidOperationException: сбор данных был изменен, операция перечисления может не выполняться.

Это пример кода ниже.Я думал, что AsReadonly () вернет коллекцию, которая была до измененного состояния.Это не тот случай.

ints = new List<int>(30);
ints.AddRange(Enumerable.Range(1, 10));
int y = 11;

foreach(int x in ints.AsReadOnly())
{
    ints.Add(y++);
    Console.WriteLine(x);
}

Ответы [ 5 ]

2 голосов
/ 11 сентября 2011

Вам необходимо использовать копию списка, которую нельзя изменить.Это работает:

foreach(int x in ints.ToArray())
{
    ints.Add(y++);
    Console.WriteLine(x);
}

Копия, конечно, неприятная.В данном конкретном случае, поскольку вы только добавляете элементы, вы можете избежать копирования, используя цикл for ():

int count = ints.Count;
for (int ix = 0; ix < count; ++ix) {
    ints.Add(y++);
    Console.WriteLine(ints[ix]);
}
1 голос
/ 11 сентября 2011

Как уже упоминалось, AsReadonly() создает оболочку только вокруг исходного списка.

Нечто подобное будет работать. Но я не уверен, что вы пытаетесь сделать, поэтому это может быть бесполезно.

var ints = new List<int>();
ints.AddRange(Enumerable.Range(1, 10));
int y = 11;

var moreInts = new List<int>();

foreach(int x in ints.AsReadOnly())
{
    moreInts.Add(y++);
    Console.WriteLine(x);
}

ints.AddRange(moreInts);
1 голос
/ 11 сентября 2011

Поскольку в документации указано AsReadonly() - это всего лишь оболочка в исходной коллекции, поэтому вы все еще работаете с той же коллекцией - применяются те же правила.

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

0 голосов
/ 11 сентября 2011

AsReadOnlyMethod () возвращает список оболочки, который запрещает модификацию, это все тот же список.

0 голосов
/ 11 сентября 2011

Вы не можете изменять коллекцию внутри цикла foreach.Попробуйте вместо этого использовать for -loop.

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