Коллекция была изменена; операция перечисления может не выполняться, даже если проверка применяется к числу строк? - PullRequest
2 голосов
/ 10 января 2012

Привет, извините, я новичок в программировании на C #, и хотя я знаю, что по этой проблеме было создано много тем, я не могу найти ту, которая применима к моему случаю, тем более что я уже применил это на других формах, и это сработало.

Это решение говорит мне повторить его в обратном порядке, однако я не знаю, как / где его применять. Я получаю ошибку в в в

foreach (DataRow dataRow_AvailableEmp in AvailableEmp_dataTable.Rows)

вот остаток кода.

    if (WithTasks_Datatable.Rows.Count > 0)
    {
        foreach (DataRow dataRow_WithTask in WithTasks_Datatable.Rows)
        {
            Booked_Initial = dataRow_WithTask["Assigned"].ToString();
            if (this_Initial != Booked_Initial) //di booked
            {
                //CHECK IF IN DATATABLE                                
                if (AvailableEmp_dataTable.Rows.Count > 0)
                {
                    foreach (DataRow dataRow_AvailableEmp in AvailableEmp_dataTable.Rows)
                    {
                        Available_Initial = dataRow_AvailableEmp["EmpID"].ToString();

                        if (this_Initial != Available_Initial) //NOT IN DB
                        {
                            //ADD

                            AvailableEmp_dataTable.Rows.Add(this_EmpID, this_Initial, PositionName, TeamName, TeamLead);
                        }
                    }
                }
                else
                {
                    //ADD
                    AvailableEmp_dataTable.Rows.Add(this_EmpID, this_Initial, PositionName, TeamName, TeamLead);
                }
            }
        }
    }

Ответы [ 5 ]

7 голосов
/ 10 января 2012

Одно простое решение - поместить строки, которые вы перебираете, в новый список:

foreach (DataRow dataRow_AvailableEmp in AvailableEmp_dataTable.Rows.Cast<DataRow>().ToList())
1 голос
/ 10 января 2012

Вы не можете / не должны изменять коллекцию, доступ к которой осуществляется через перечислитель.

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

Вместо этого две атаки для этого доступа по индексу, как предложено @ mhornfeck

Или вы создаете пустые таблицы данных, добавляя их.Затем добавьте добавленные строки в исходную коллекцию.

0 голосов
/ 10 января 2012

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

Чтобы выполнить итерацию по коллекции и добавлять элементы на основе того, что вы найдете, добавьте элементы ввременно List<DataRow> и затем добавьте их к DataTable после завершения итерации.

0 голосов
/ 10 января 2012

Если вы хотите использовать foreach (без причины), вам придется один раз выполнить цикл, чтобы создать список всех сотрудников, которых вы хотите добавить. Переберите список сотрудников, чтобы добавить и добавить их в базу данных.

0 голосов
/ 10 января 2012

Чтобы выполнить итерацию в обратном направлении, используйте for вместо foreach:

for (int i = AvailableEmp_dataTable.Rows.Count - 1; i >= 0; --i)
        {
            DataRow dataRow_AvailableEmp = AvailableEmp_dataTable.Rows[i];
            Available_Initial = dataRow_AvailableEmp["EmpID"].ToString();

            if (this_Initial != Available_Initial) //NOT IN DB
            {
                //ADD
                AvailableEmp_dataTable.Rows.Add(this_EmpID, this_Initial, PositionName, TeamName, TeamLead);
            }
        }

С http://www.dotnetperls.com/foreach

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

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