Для каждой ошибки цикла: коллекция была изменена; операция перечисления может не выполняться

#asp.net #vb.net #datarow

#asp.net #vb.net #поток данных

Вопрос:

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

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

     Dim dRow As DataRow
    For Each dRow In dt.Rows
        dt.Rows.Add(dRow("CustNum"), dRow("SalesRepName"), dRow("mgrid"), "=""" amp; dRow("midValue") amp; """", dRow("dba"), dRow("sysDate"), dRow("statusID"))
    Next  
  

Ошибка возникает при первом попадании кода в « Next «
То, что могло бы вызвать сбор, было изменено; операция перечисления может не выполняться.Как я могу устранить эту ошибку?

Ответ №1:

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

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

Что-то вроде этого должно работать:

 Dim rowCount As Integer = dt.Rows.Count  ' Set upper bound = original row count
Dim index as Integer
For index = 0 To rowCount - 1  ' Iterate through the original set of rows
    Dim dRow as DataRow = dt.Rows.Item(index)  ' Get row by index
    dt.Rows.Add(dRow("CustNum"), dRow("SalesRepName"), dRow("mgrid"), "=""" amp; dRow("midValue") amp; """", dRow("dba"), dRow("sysDate"), dRow("statusID"))
Next index
  

Ответ №2:

Вы добавляете элементы в коллекцию, которую вы перечисляете. Логически, цикл будет бесконечным. Такая ситуация не может возникнуть. Если вы действительно хотите это сделать, разделите его на две части, создав Structure или Class для ваших данных, добавив элементы в список, затем пройдитесь по списку и добавьте элементы в таблицу.