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-Key: 231075

Url: https://administrator.de/contentid/231075

Printed on: April 23, 2024 at 16:04 o'clock

Member: colinardo
Solution colinardo Feb 26, 2014 updated at 17:32:21 (UTC)
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
Member: emeriks
emeriks Feb 26, 2014 at 15:15:45 (UTC)
Goto Top
Ja, nee is klar ....
Danke!