emeriks
Goto Top

VB.Net - Frage zu SortedList

Hi,
habe mal ne Frage zum Verständnis von "for each" im Zusammenhang mit "SortedList" in VB.Net.

Wenn ich die Elemente einer Liste durchlaufe und dabei ein Element lösche, dann "springt der Zeiger". Das weiß ich und kann auch damit umgehen, jedoch weiß ich nicht, ob das nicht noch einfacher geht.

Beispiel: Habe eine Liste mit unbekannten Schlüsseln aber bekannten Werten.
Dim x As New SortedList
x.Add("unbekannter Key A", "Buchstabe A")  
x.Add("unbekannter Key B", "Buchstabe B")  
x.Add("unbekannter Key C", "Buchstabe C")  
x.Add("unbekannter Key D", "Buchstabe D")  

Wenn ich die Elemente durchlaufe, nach einem Element "Buchstabe C" oder "Buchstabe D" suche und diese dann lösche, dann fliegt mir der Code im Beispiel 1 nach dem Löschen von "Buchstabe C" beim "Next" raus.
For Each y As DictionaryEntry In x
  If y.Value = "Buchstabe C" Or y.Value = "Buchstabe D" Then  
    x.Remove(y)
  Else
    MsgBox(y)
  End If
Next

Alternativ über den Key. Hier kommt der Fehler auch beim "Next" wenn "Buchstabe C" gelöscht wurde.
For Each k As String In x.Keys
  Dim y As String = x(k)
  If y = "Buchstabe C" Or y = "Buchstabe D" Then  
    x.Remove(k)
  Else
    MsgBox(y)
  End If
Next

Lösen tue ich das so, indem ich in einem ersten Durchlauf zunächst alle Keys der zu löschenden Elemente in einer Liste sammle und dann in einem zweiten Durchlauf die Elemente laut der gesammelten Liste lösche.
Dim ToRemove As New List(Of String)
For Each k As String In x.Keys
  Dim y As String = x(k)
  If y = "Buchstabe C" Or y = "Buchstabe D" Then  
    ToRemove.Add(k)
  Else
    MsgBox(y)
  End If
Next
For Each k As String In ToRemove
  x.Remove(k)
Next


Geht das nicht auch einfacher?

E.

Content-ID: 231075

Url: https://administrator.de/forum/vb-net-frage-zu-sortedlist-231075.html

Ausgedruckt am: 03.04.2025 um 20:04 Uhr

colinardo
Lösung colinardo 26.02.2014 aktualisiert um 18:32:21 Uhr
Goto Top
Hallo Emeriks,
Geht das nicht auch einfacher?
z.B. so
x.RemoveAt(x.IndexOfValue("Buchstabe C"))  
x.RemoveAt(x.IndexOfValue("Buchstabe D"))  
oder so wenn doch mehrere Sachen zu entfernen sind mit Array für die Strings...
Dim arr As String() = {"Buchstabe C", "Buchstabe D"}  
For Each el As String In arr
    x.RemoveAt(x.IndexOfValue(el))
Next
Grüße Uwe
emeriks
emeriks 26.02.2014 um 16:15:45 Uhr
Goto Top
Ja, nee is klar ....
Danke!