2016-04-20 3 views
1

Gibt es eine Möglichkeit, das vorherige Element oder das nächste Element beim Iterieren von Listen in VB.NET wiederherzustellen? Etwas wie:VB.NET Wie erhalten Sie das vorherige Element während der Iteration von Listen?

For Each item In MyList 
    Dim current_item = item 
    Dim previous_item = Prev(item) 
    Dim next_item = Next(item) 
Next 

Gibt es eine eingebaute Funktion, die tun, was imaginäre Funktionen "Prev()/Next()" hier tun? Bitte beantworten Sie, wenn es bereits eine verfügbare Funktion gibt, sonst weiß ich, wie ich sie selbst schreibe.

Vielen Dank im Voraus

+1

Aktivieren Sie Option Strict - Es wird Ihnen helfen, Code zu schreiben, der auf lange Sicht einfacher zu warten ist und möglicherweise Fehler reduziert –

Antwort

1

Sie von Index anstelle laufen kann - sicher sein, dass es einen vorherigen oder nächsten Punkt zu überprüfen ist, sonst werden Sie eine Ausnahme erhalten:

For i = 0 to MyList.Count - 1 
    Dim current_item = MyList(i) 
    Dim previous_item = If(i > 0, MyList(i - 1), Nothing) 
    Dim next_item = If(i < MyList.Count - 1 , MyList(i + 1), Nothing) 
Next 

Auf diese Weise wissen Sie genau, wo bist du zu allen Zeiten.

Denken Sie daran, dass For Each nicht unbedingt bedeutet, dass die Reihenfolge garantiert ist (es hängt vom Typ ab). Siehe diese Frage für weitere Informationen Is the .NET foreach statement guaranteed to iterate a collection in the same order in which it was built?

0

Nein, das Objekt "item" ist sich seines Platzes in der Sammlung nicht bewusst, so dass es nicht in der Lage wäre, es selbst zu suchen. Am besten erstellen Sie Ihren eigenen Listentyp und implementieren die Funktionen, wenn Sie diese erneut verwenden möchten.

sub Test 
    Dim l As New MyCustomList 
    l.Add(1) 
    l.Add(2) 
    l.Add(3) 

    For Each o As Object In l 
     Dim c As Object = o 
     Dim prevo As Object = l.PrevItem(c) 
     Dim nexto As Object = l.NextItem(c) 
    Next 
end sub 

Public Class MyCustomList 
    Inherits ArrayList 

    Public Function PrevItem(item As Object) As Object 
     Dim x As Int32 = Me.IndexOf(item) 
     If x > 0 Then Return Me.Item(x - 1) 
     Return Nothing 
    End Function 

    Public Function NextItem(item As Object) As Object 
     Dim x As Int32 = Me.IndexOf(item) 
     If x < Me.Count - 1 Then Return Me.Item(x + 1) 
     Return Nothing 
    End Function 
End Class 
+1

Dies ist nicht die beste Lösung. Es verwendet das alles veraltete 'ArrayList'-Objekt und es verwendet' IndexOf', um Elemente in der Liste zu finden - sobald also ein doppelter Wert vorliegt, fällt der Code um. – Enigmativity

0

Mit der LinkedList(Of T) Liste meine Arbeit gut für Sie.

Wenn ich annehmen kann, dass die Art der Liste ist Integer dann funktioniert dies:

Dim MyLinkedList = New LinkedList(Of Integer)(MyList) 

Dim node As LinkedListNode(Of Integer) = MyLinkedList.First 
While node IsNot Nothing 
    Dim current_node = node 
    Dim previous_node = node.Previous 
    Dim next_node = node.Next 

    ' Do stuff in here with `*_node.Value` 
    ' Don't forget to check for `Nothing` 
    ' in previous and next nodes 

    node = node.Next 
End While 

Das einzige, was Sie überprüfen müssen, ist, wenn previous_node & next_nodeNothing sind.