2013-09-05 7 views
1

Что я здесь сделал, это сохранить таблицу из двух столбцов в архаристе и словаре.vb.net arraylist dictionary loop

Dim result As New ArrayList() 
While dr.Read() 
     ' Insert each column into a dictionary 
     Dim dict As New Dictionary(Of String, Object) 
     For count As Integer = 0 To (dr.FieldCount - 1) 
      dict.Add(dr.GetName(count), dr(count)) 
     Next 
     ' Add the dictionary to the ArrayList 
     result.Add(dict) 
    End While 

......... Теперь я хочу, чтобы пройти через это, и когда он нашел - удалить его. Его для экономии времени, поскольку есть много данных. Я получаю ошибку «Коллекция была изменена, операция перечисления может не выполняться». после удаления и перехода к следующему. Я понимаю проблему, но как мне это преодолеть? Как преобразовать его в цикл с удалением?

For Each dat As Dictionary(Of String, Object) In result 
         comp2 = dat("ID") 
         If comp2 = comp Then 
          advcode = advcode & "," & dat("ADVC") 
          found = True 
          firstattempt = False 
          result.Remove(dat) 
         Else 
          If found And Not firstattempt Then Exit For 
         End If 
        Next 

ответ

1

как правило, два пути, чтобы исправить это:

  1. пересекают ArrayList со спины:

    For i As Integer = result.Count - 1 To 0 Step -1 
        Dim dat = CType(result(i), Dictionary(Of String, Object)) 
        ' ... 
        ' if found: 
        result.RemoveAt(i) 
    Next 
    
  2. скопировать ArrayList в новый массив:

    For Each Dat As Dictionary(Of String, Object) In result.ToArray() 
        ' do your stuff here 
    Next 
    

вариант 1 следует дать более высокую производительность

2

Почему вы не используете List(Of Dictionary(Of String, Object)) вместо с ArrayList? Это сделает код более понятным.

Тем не менее, просто скопировать коллекцию в новый, так что удаление элемента из оригинальной коллекции не прекращает итерацию копии:

For Each dat As Dictionary(Of String, Object) In result.ToArray() ' Copy into new array ' 
    comp2 = dat("ID") 
    If comp2 = comp Then 
     advcode = advcode & "," & dat("ADVC") 
     found = True 
     firstattempt = False 
     result.Remove(dat) 
    Else 
     If found And Not firstattempt Then Exit For 
    End If 
Next 
1

Попробуйте это:

Dim iCont As Integer = 0 

While result.Count > iCont 
    Dim dat As Dictionary(Of String, Object) = CType(result(iCont), Dictionary(Of String, Object)) 
    comp2 = dat("ID") 
    If comp2 = comp Then 
     advcode = advcode & "," & dat("ADVC") 
     found = True 
     firstattempt = False 
     result.Remove(dat) 
    Else 
     If found And Not firstattempt Then Exit For 
     iCont += 1 
    End If 
End While 
+1

Если элемент не найден, вы будете застряли в бесконечный цикл .... – sloth

+1

Вы правы. Я просто предложил цикл «While», но код должен быть изменен, чтобы избежать этой проблемы. Исправленный. – SysDragon