Коллекция была изменена; операция перечисления может не выполняться

Концепция жизненного цикла

В следующей секции объясняется теоретическая модель. Современные JavaScript движки внедряют/имплементируют и существенно оптимизируют этот процесс.

Для лучшего визуального представления работы Event loop, Вы можете ознакомиться с данным видео: https://www.youtube.com/watch?v=8aGhZQkoFbQ&t=389s

Вызов любой функции создаёт контекст выполнения (). При вызове вложенной функции создаётся новый контекст, а старый сохраняется в специальной структуре данных — стеке вызовов (Call Stack).

Когда вызывается функция ,  создаётся первый контекст выполнения, содержащий аргументы функции  и локальные переменные. Когда вызывает , создаётся второй контекст с аргументами  и её локальными переменными.  И этот контекст выполнения  помещается в стек вызовов выше первого. Когда возвращает результат, верхний элемент из стека удаляется. Когда возвращает результат, её контекст также удалится, и стек становится пустым.

Объекты размещаются в куче. Куча — это просто имя для обозначения большой неструктурированной области памяти.

Среда выполнения JavaScript содержит очередь задач. Эта очередь — список задач, подлежащих обработке. Каждая задача ассоциируется с некоторой функцией, которая будет вызвана, чтобы обработать эту задачу.

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

Обработка задачи заканчивается, когда стек снова становится пустым. Следующая задача извлекается из очереди и начинается её обработка.

Парадокс Полчинского

Американский физик-теоретик Джозеф Полчинский предложил сценарий временного парадокса, в котором бильярдный шар входит в червоточину и появляется в прошлом как раз в тот момент, чтобы столкнуться с младшей версией себя и остановить вхождение. Парадокс Полчинского воспринимается физиками очень серьезно благодаря теории относительности Эйнштейна, которая предполагает возможность путешествовать во времени.

Когда Джозеф предположил свой парадокс, то вложил в него принцип Новикова, который подтверждает возможность путешествия во времени, но запрещает временные парадоксы. Благодаря этому были сформированы решения, которые помогут избежать временных парадоксов, а значит, и изменений в прошлом. Возьмем наш бильярдный шар: шар, который появится из червоточины, ударит искомую версию и изменит направление ее движения, но недостаточно, чтобы помешать ей войти в червоточину.

Это значит, что вмешательство в прошлое может произойти, но оно лишь изменит временную линию истории, дополнив каким-либо событием, но саму историю изменить не удастся. Это объясняет и парадокс деда, в котором попытки убить его будут оканчиваться провалом.

6 ответов

Лучший ответ

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

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

Есть несколько различных стратегий, которые можно использовать, чтобы избежать этой проблемы:

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

  2. Вы можете избежать изменения фактической коллекции внутри цикла . Типичными примерами этого являются создание или другой коллекции «изменений, которые необходимо внести», будь то , и т. Д. Затем вы можете добавить / удалить / что угодно для всех этих элементов после петля. (Это эффективно, если вы изменяете только небольшой процент размера коллекции.)

  3. Некоторые типы коллекций можно «повторять» без фактического использования традиционного итератора (имеется в виду цикл ). Например, вы можете перебирать , используя вместо этого обычный цикл , и просто изменять (увеличивать / уменьшать) переменную цикла всякий раз, когда вы добавляете или удаляете элементы. Это, если все сделано правильно, имеет тенденцию быть эффективным вариантом, но довольно легко ошибиться и сделать что-то не так, поэтому, хотя другие варианты (незначительно) менее эффективны, они являются очень хорошими вариантами для кода, не требующего высокой производительности из-за их простота.

9

Servy
19 Июл 2012 в 14:56

Когда вы используете ForEach поверх TabItems в tabControl, вы не можете делать ничего внутри ForEach, что приведет к изменению коллекции элементов tabControl.

Это ограничение фреймворка. Это потому, что вы в настоящее время перебираете TabItems.

Итак, внутри вашей функции ChildNode_Click ,

Внутри вашего ForEach

Вы звоните

Внутри этой функции вы вызываете

Вы не можете управлять коллекцией Items, находясь внутри ForEach.

Scen
19 Июл 2012 в 14:58

Да, эта линия

Изменяет коллекцию, которую вы перечисляете в NodeClick и этого нет-нет в мире перечисления

Попробуйте выполнить цикл со стандартным for, но в обратном порядке ……

Зацикливание в обратном порядке избегает проверки новых элементов, добавленных внутри SubGraphButton. Я не знаю, желаемый ли это эффект или нет.

1

Steve
19 Июл 2012 в 15:00

Вы не можете изменять коллекцию, в которой выполняете итерацию.

Вы можете заменить цикл «foreach» простым циклом «for», но обратите внимание на индекс, который вы используете при добавлении / удалении элементов из коллекции. Типа того:

Типа того:

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

1

Tamir
19 Июл 2012 в 14:53

Внутри цикла foreach вы вызываете SubGraphButton_Click, который, в свою очередь, добавляет новый узел Это не разрешено. Вместо этого вы можете использовать цикл for.

1

Amiram Korach
19 Июл 2012 в 14:48

Вам не разрешается изменять коллекцию (в данном случае ), пока вы ее перечисляете (что вы делаете в своем цикле ), так как это сделает перечислитель недействительным.

Конкретная строка кода, вызывающая ошибку, скорее всего, будет

Концептуально ваш код выглядит так:

1

RB.
19 Июл 2012 в 14:48

Парадокс предопределения

Этот парадокс возникает, когда человек, путешествующий во времени, становится частью прошлых событий и его действия в конечном счете приводят к тому событию, на которое он пытается повлиять или предотвратить. Благодаря ему создается временной цикл причинности, в котором Событие 1 в прошлом влияет на Событие 2 в будущем (имеется в виду путешествие во времени в прошлое), которое и стало причиной События 1. Создается некий круговорот циклов, который гарантирует, что история не изменится, так что любые путешествия во времени и попытки изменить прошлое приведут к самой причине, а не исправлению этих действий. Данный парадокс предполагает, что все в любом случае случится так, как должно, и ничто этого не изменит.

Иными словами, путешествие и действия человека становятся самой причиной, из-за которой и случились определенные события. Предположим, что твою собаку сбила машина и ты решил вернуться в прошлое, чтобы это исправить. Ты знаешь время и место и уже готов спасти пса. Вот ты видишь, как он начинает перебегать дорогу, и кидаешься, чтобы не дать ему это сделать. В этот момент из-за угла выруливает машина, которая вот-вот собьет тебя. Чтобы не наехать на человека, водитель крутит руль и случайно наезжает на собаку. То есть твое появление в прошлом и стало причиной того, что собака умерла.

Онтологический парадокс

В этом парадоксе говорится о том, что любой объект, человек или часть информации, которые будут отправлены назад во времени, приведут к бесконечному циклу, в котором данный объект не имеет видимого происхождения, или даже не создавался. Иначе этот парадокс можно объяснить на примере молодого человека, который отправился назад в прошлое и там охмурил дамочку, с которой затем переспал. Через 3 месяца он вернулся в свое время, не зная, что эта женщина беременна. Ее ребенок растет, и становится, – угадай кем – да, путешественником во времени, который возвращается назад и встречает женщину, и так далее по бесконечному кругу.

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

Цикл for

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

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

Цикл for существует в двух формах:

for счетчик=значение to конечное_значение do 
     тело_цикла;
for счетчик=значение downto конечное_значение do 
     тело_цикла;

Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.

Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, циклу уже точно известно, сколько раз надо выполниться.

var
    i, n integer;
 
begin
    write ('Количество знаков: ');
    readln (n);
 
    for i = 1 to n do
        write ('(*) ');
 
readln
end.

Заповедник антиваксеров

И тут есть один важный момент. В других случаях российские власти проявляют принципиальность и жесткость там, где она даже кажется чрезмерной. Стоит только снять штаны на фоне церкви – и можно сесть в тюрьму. А за поступившую на банковский счет копеечку от иностранного работодателя можно очень быстро получить клеймо иноагента со всеми вытекающими последствиями.

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

Тут можно построить немало конспирологических теорий о том, что главные антиваксеры в России окопались чуть ли не на вершине вертикали власти. И именно поэтому борьба с ковидом временами выглядит очень странно. Но факт остается фактом: на фоне сверхжестких антикоронавирусных ограничений в просвещенной и демократической Европе Россия пока остается заповедником антипрививочников и ковидных свобод.

Хочешь понять, что происходит на самом деле?

Читай Телеграм канал и «Ясно Понятно».

Просто и доходчиво — о самых важных новостях в обществе, политике и экономике.

Без лишних слов расскажем о том, кто виноват и что делать.

От медицины до политики

Судя по всему, попытка быстро ввести по всей России обязательные QR-коды и тем самым ускорить темпы вакцинации провалилась в самом начале. Госдума, очевидно, не желает брать на себя полную ответственность за непопулярное решение и спихивает все на регионы. Которые, зачастую не понимая царящих в Москве настроений, пытаются лавировать, вводят ограничения самостоятельно, но уже сталкиваются с протестами населения.

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

Открытое письмо главврачей каким-то фрикам из медиа-бизнеса, тысячи безумных комментариев под постом спикера Госдумы Вячеслава Володина про QR-коды, усиливающиеся публичные раздоры между «антиваксерами» и «ковидобесами» явно не способствуют появлению какого-то здравого смысла и логики в борьбе с эпидемией. В итоге лишь усиливается общественный раскол, который может вылиться в невиданную в России за 20 лет политическую турбулентность.

12 ответов

  • 1311 рейтинг

    Что, вероятно, происходит, так это то, что SignalData косвенно изменяет словарь подписчиков под капотом во время цикла и приводит к этому сообщению. Вы можете проверить это, изменив

    до

    Если я прав, проблема исчезнет

    ответ дан JaredPar, с репутацией 555649, 3.03.2009

  • 97 рейтинг

    Когда подписчик отменяет подписку, вы изменяете содержимое коллекции подписчиков во время перечисления.

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

    ответ дан Mitch Wheat, с репутацией 248826, 3.03.2009

  • 54 рейтинг

    Более эффективный способ, по моему мнению, состоит в том, чтобы иметь другой список, в который вы объявляете, что вы помещаете все, что «должно быть удалено». Затем после завершения основного цикла (без. ToList ()), вы делаете еще один цикл над списком «подлежащих удалению», удаляя каждую запись, как это происходит. Итак, в вашем классе вы добавляете:

    Затем измените его на:

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

    ответ дан x4000, с репутацией 1857, 3.03.2009

  • 33 рейтинг

    Вы также можете заблокировать словарь подписчиков, чтобы предотвратить его изменение при зацикливании:

    ответ дан Mohammad Sepahvand, с репутацией 13346, 23.05.2012

  • 9 рейтинг

    Примечание : В целом. Сетевые коллекции не поддерживают одновременное перечисление и изменение. Если вы попытаетесь изменить список коллекции, пока вы находитесь в процессе его перечисления, это вызовет исключение.

    Таким образом, проблема, стоящая за этой ошибкой, заключается в том, что мы не можем изменить список / словарь, пока выполняем цикл. Но если мы выполняем итерацию по словарю, используя временный список его ключей, параллельно мы можем модифицировать объект словаря, потому что теперь мы не выполняем итерацию по словарю (и итерируем его коллекцию ключей).

    образец:

    Вот блог об этом решении.

    А для глубокого погружения в stackoverflow: Почему возникает эта ошибка?

    ответ дан open and free, с репутацией 1412, 11.11.2014

  • 4 рейтинг

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

    Что вам действительно нужно сделать, это начать с конца и вернуться к началу. Даже если вы удалите элементы из списка, вы сможете продолжить его чтение.

    ответ дан luc.rg.roy, с репутацией 41, 23.05.2012

  • 3 рейтинг

    InvalidOperationException- Произошло исключение InvalidOperationException. Он сообщает, что «коллекция была изменена» в цикле foreach

    Используйте оператор break, как только объект будет удален.

    ex:

    ответ дан vivek, с репутацией 31, 16.03.2017

  • 2 рейтинг

    Я видел много вариантов для этого, но для меня этот был лучшим.

    Тогда просто переберите коллекцию.

    Имейте в виду, что коллекция ListItemCollection может содержать дубликаты. По умолчанию ничто не препятствует добавлению дубликатов в коллекцию. Чтобы избежать дубликатов вы можете сделать это:

    ответ дан Mike, с репутацией 133, 4.03.2015

  • 2 рейтинг

    У меня была та же проблема, и она была решена, когда я использовал петлю вместо .

    ответ дан Daniel Moreshet, с репутацией 61, 16.06.2014

  • 1 рейтинг

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

    ответ дан Mark Aven, с репутацией 20, 22.07.2018

  • 0 рейтинг

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

    ответ дан Rezoan, с репутацией 1131, 29.05.2013

  • 0 рейтинг

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

    ответ дан ford prefect, с репутацией 2590, 4.10.2013

Парадокс убийства Гитлера

Подобно парадоксу деда, который может предотвратить собственное рождение, парадокс Гитлера стирает саму причину того, чтобы вернуться назад во времени и убить. Кроме того, убийство деда имеет ограниченный «эффект бабочки», а убийство злобного немца приведет к последствиям, которые отразятся на всем мире. Сам парадокс возникает в первую очередь из-за того, что вряд ли бы кто-то столь успешный, имеющий в распоряжении машину времени, стал бы путешествовать с целью уничтожения Гитлера, ведь сегодня он на коне, зачем что-то менять. С другой стороны, если бы ты убил фюрера, то он не совершил бы ни одного действия, которое вызвало бы желание сделать это.

Союз While и наречие Meanwhile

Оба эти слова переводятся на русский язык “во время”, “в то время как”, “тем временем”. Оба слова используются для описания двух действий, которые происходят одновременно. В чем же заключается разница в их использовании? В английском языке существует три основные момента, которые необходимо учитывать при выборе между while и meanwhile.

Количество предложений

В этом пункте речь скорее идет не о количестве предложений, а количестве точек. Нам известно, что существуют сложные предложения, совмещающие два или более простых, но разделяются они запятыми. При использовании meanwhile действия в предложении обязательно должны отделяться точкой!

She was reading Dickens. Meanwhile, her husband was sleeping. — Она читала Диккенса, в то время как ее муж спал.

Стоит обратить внимание на то, что наречие meanwhile в английском языке всегда выделяется запятой. Союз while в значении “в то время как” используется в подчинительном предложении, где действия точкой не отделяются:

Союз while в значении “в то время как” используется в подчинительном предложении, где действия точкой не отделяются:

She was reading Dickens while her husband was sleeping. — Она читала Диккенса, в то время как ее муж спал.

Место “в то время как” в предложении

While будучи союзом может использоваться либо в начале, либо в середине, соединяя два предложения:

I read while having breakfast. — Я читаю во время завтрака.
I have breakfast while reading. — Я завтракаю во время чтения.

За meanwhile закреплено место в предложении и оно неизменно. Наречие meanwhile всегда стоит в начале второго предложения, то есть сразу после точки:

I’m having breakfast. Meanwhile I’m reading. — Я завтракаю и между тем читаю./ Я завтракаю и во время этого читаю.

Взаимосвязь с другими словами в предложении

Являясь фактически вводным, наречие meanwhile требует после себя подлежащеe, подчиняясь порядку слов в английском языке — подлежащее — сказуемое — все остальное:

I kept working. Meanwhile, my partner was partying hard. — Я продолжал работать, в то время как мой напарник жестко напивался.

Союз while более демократичен. За ним может следовать подлежащее, но чаще вы встретите глагол с окончанием —ing — то есть непосредственно само действие:

I kept working while my partner was partying hard. — Я продолжал работать, в то время как мой напарник жестко напивался. (подлежащее+сказуемое)

I kept listening to music while doing my home work. — Я продолжала слушать музыку в то время как делала уроки. (глагольная форма с окончанием -ing)

В заключении хотим дать вам еще одну подсказку: как различить английский союз while от предлога during. Для многих является затруднительным этот выбор, потому что перевод слов очень близок в значении — “во время”. Все просто.

Запомните: предлог during + существительное, союз while + предложение (подлежащее и сказуемое или только глагольная форма с окончанием —ing):

Have fun while learning English! — Веселитесь во время изучения английского!

We hope you’ll never be bored during the class! — Надеемся вам не будет скучно на занятиях!
Успехов в обучении!

Виктория Теткина

Неспешные законы

Полностью законы о QR-кодах могут быть приняты уже после Нового года, сообщил источник «Ведомостей» в Госдуме.

«Пройдет первое чтение, после этого назначат рассылку инициативы другим субъектам законодательной инициативы для сбора поправок, она займет месяц, и уже после этого пройдет второе чтение – в январе», – сказал собеседник. Такая «рассылка» обязательна по регламенту Госдумы, заявил источник, отметив, что даже сейчас инициатива правительства влияет на людей: «Темп вакцинации растет».

Впрочем, если этот рост и происходит, то минимальными темпами. В России полностью привиты всего чуть более 38% всего населения, и это 93-е место в мире. В Европе хуже дела обстоят только в Болгарии, Румынии, Албании, Украине и Белоруссии.

Предлоги For и During

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

Английский предлог For

Предлог for на английском языке обозначает “длительность в течение” и используется преимущественно с указанием срока, во время которого происходит действие. С его помощью мы рассказываем, как долго длится то или иное событие, действие:

I haven’t seen you for ages. — Я тебя сто лет не видела (в течение ста лет).

They will be living there for three weeks. — Они будут жить там три недели (в течение трех недель).

Английский предлог During

During также является предлогом и переводится с английского языка “в продолжение”, “в течение”, “во время”. Это слово используется в паре с существительным. Но задача сочетания другая. В английском языке использование предлога during необходимо для того, чтобы рассказать когда происходит событие, а не как долго оно длится (как в случае с for). Это представляет главное различие двух слов:

They will be living there during next summer. — Они будут жить там (когда?) летом.

Listeners are not allowed to talk loudly during the class. — Слушателям не разрешается разговаривать громко (когда?) во время занятий.

И, хотя, остается условная граница временного периода (лето, например, длится всего три месяца), during все же имеет более размытые сроки в сравнении с for, где действие выполняется “от сих до сих”.

I’m going to write the report during the week. — Я напишу отчет на неделе.

I’ll be writting the report for a week. — Я буду всю неделю писать этот отчет.

Сатанинский QR-код

При этом в Кремле и правительстве обсуждают возможные названия документа об ограничениях для непривитых россиян, рассказали РБК источники, близкие к администрации президента и правительству. Власти вообще планируют свести к минимуму использование термина «QR-код» в публичной риторике.

В настоящее время с помощью социологических исследований тестируются разные варианты того, какое название могло бы быть у документа для привитых и переболевших официально граждан. В числе обсуждающихся вариантов, — «паспорт здоровья», «сертификат здоровья», «зеленый паспорт», «ковипасс», «санитарный паспорт» и т.д.

Многие люди негативно воспринимают сам термин «QR-код», рассказал один из собеседников РБК, ссылаясь на закрытые социсследования. Они показывают, что отрицательно к нему относятся чуть более 50% россиян. В их числе как вакцинированные, так и не прошедшие вакцинацию. При этом возможен рост числа негативно относящихся к такому термину людей. Часть граждан считают словосочетание «QR-код» сатанинским, кто-то воспринимает его через призму ограничения свобод, пояснил собеседник РБК.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: