zak100 Ответов: 3

C#: как всплывать элементы с помощью цикла?


Привет,
Я написал следующий код:

foreach (Object i in objStack)
                Console.WriteLine(" {0}", objStack.Pop());


Но я получаю следующее сообщение об ошибке:

Unhandled Exception: System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
   at System.Collections.Stack.StackEnumerator.MoveNext()
   at Stack1.Program.Main(String[] args) in D:\PhD Courses ttu\C-Sharp\Stack1\Stack1\Program.cs:line 16


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

Зульфи.

Что я уже пробовал:

Я искал в интернете, но не могу найти никакого решения.

3 Ответов

Рейтинг:
2

OriginalGriff

При использовании foreach цикл, вы устанавливаете и используете что-то под названием an enumerator который возвращает каждый элемент в последовательности, как вы идете вокруг цикла. Если вы измените объект то enumerator работает, он не может быть уверен, над каким элементом работать дальше, и поэтому вы получаете ошибку.
Эффективно, то foreach петля устанавливается на петли:

int count = deck.Count;
for (int i = 0; i < count; i++)
    {
    Card c = deck[i];
    Console.WriteLine(c);
    }
Если вы начнете удалять карты внутри цикла:
int count = deck.Count;
for (int i = 0; i < count; i++)
    {
    Card c = deck[i];
    if (c.IsSpade)
        {
        deck.Remove(c);
        }
    Console.WriteLine(c);
    }
Тогда это вызовет две проблемы:
1) он не будет печатать карту после лопаты.
2) он будет сбегать с конца колоды, потому что петля этого не "знает". i больше не стоит подниматься так высоко.
(foreach это не так - это довольно сложно внутренне, но принцип тот же самый)
Вы не можете изменить набор внутри foreach, или изменить значение параметра foreach переменная внутри цикла.
Попробуйте вместо этого:
while(objStack.Count > 0)
   {
   Console.WriteLine(" {0}", objStack.Pop());
   }

Или возможно:
foreach (Object i in objStack)
   {
   Console.WriteLine(" {0}", i);
   }


BillWoodruff

+5 лучшее объяснение этого я видел. Я добавлю довольно очевидное послесловие.

Рейтинг:
2

Patrice T

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


Рейтинг:
0

BillWoodruff

Решение "бритвы Оккама": objStack.Четкий();

Примечание: стек C# по своей конструкции представляет собой коллекцию, которая имеет несколько параметров функций (основанных на методе расширения Linq), которые можно использовать с другими коллекциями.

Если вам нужно/нужно удалить элементы из стека, которые не находятся "сверху," тогда тебе наверное стоит нет используйте стек.