For Each...Next-Anweisung (Visual Basic)For Each...Next Statement (Visual Basic)

Wiederholt eine Gruppe von-Anweisungen für jedes Element in einer Auflistung.Repeats a group of statements for each element in a collection.

SyntaxSyntax

For Each element [ As datatype ] In group
    [ statements ]
    [ Continue For ]
    [ statements ]
    [ Exit For ]
    [ statements ]
Next [ element ]

TeileParts

BegriffTerm DefinitionDefinition
element Erforderlich in der For Each-Anweisung.Required in the For Each statement. Optional in der Next-Anweisung.Optional in the Next statement. Veränder.Variable. Wird verwendet, um die Elemente der Auflistung zu durchlaufen.Used to iterate through the elements of the collection.
datatype Optional, wenn Option Infer aktiviert ist (Standard) oder element bereits deklariert ist. erforderlich, wenn Option Infer deaktiviert ist und element nicht bereits deklariert ist.Optional if Option Infer is on (the default) or element is already declared; required if Option Infer is off and element isn't already declared. Der Datentyp von element.The data type of element.
group Erforderlich.Required. Eine Variable mit einem Typ, der ein Auflistungstyp oder ein Objekt ist.A variable with a type that's a collection type or Object. Verweist auf die Auflistung, über die die statements wiederholt werden soll.Refers to the collection over which the statements are to be repeated.
statements Optional.Optional. Eine oder mehrere Anweisungen zwischen For Each und Next, die für jedes Element in group ausgeführt werden.One or more statements between For Each and Next that run on each item in group.
Continue For Optional.Optional. Überträgt die Steuerung an den Anfang der For Each-Schleife.Transfers control to the start of the For Each loop.
Exit For Optional.Optional. Überträgt die Steuerung aus der For Each-Schleife.Transfers control out of the For Each loop.
Next Erforderlich.Required. Beendet die Definition der For Each-Schleife.Terminates the definition of the For Each loop.

Einfaches BeispielSimple Example

Verwenden Sie eine For Each... Next-Schleife, wenn Sie einen Satz von-Anweisungen für jedes Element einer Auflistung oder eines Arrays wiederholen möchten.Use a For Each...Next loop when you want to repeat a set of statements for each element of a collection or array.

Tipp

Ein für... Die nächste Anweisung funktioniert gut, wenn Sie jede Iterationen einer Schleife einer Steuerelement Variablen zuordnen und die Anfangs-und Endwerte der Variablen ermitteln können.A For...Next Statement works well when you can associate each iteration of a loop with a control variable and determine that variable's initial and final values. Wenn Sie sich jedoch mit einer Auflistung beschäftigen, ist das Konzept der Anfangs-und Endwerte nicht sinnvoll, und Sie wissen nicht unbedingt, wie viele Elemente die Auflistung enthält.However, when you are dealing with a collection, the concept of initial and final values isn't meaningful, and you don't necessarily know how many elements the collection has. In dieser Art von Fall ist eine For Each... Next-Schleife oft die bessere Wahl.In this kind of case, a For Each...Next loop is often a better choice.

Im folgenden Beispiel wird die For Each... NextIn the following example, the For EachNext die-Anweisung durchläuft alle Elemente einer Listen Auflistung.statement iterates through all the elements of a List collection.

' Create a list of strings by using a
' collection initializer.
Dim lst As New List(Of String) _
    From {"abc", "def", "ghi"}

' Iterate through the list.
For Each item As String In lst
    Debug.Write(item & " ")
Next
Debug.WriteLine("")
'Output: abc def ghi

Weitere Beispiele finden Sie unter Sammlungen und Arrays.For more examples, see Collections and Arrays.

Schsted LoopsNested Loops

Sie können For Each-Schleifen schachteln, indem Sie eine Schleife in eine andere einfügen.You can nest For Each loops by putting one loop within another.

Das folgende Beispiel veranschaulicht die For Each... Next.The following example demonstrates nested For EachNext Gebäuden.structures.

' Create lists of numbers and letters
' by using array initializers.
Dim numbers() As Integer = {1, 4, 7}
Dim letters() As String = {"a", "b", "c"}

' Iterate through the list by using nested loops.
For Each number As Integer In numbers
    For Each letter As String In letters
        Debug.Write(number.ToString & letter & " ")
    Next
Next
Debug.WriteLine("")
'Output: 1a 1b 1c 4a 4b 4c 7a 7b 7c 

Wenn Sie Schleifen schachteln, muss jede Schleife über eine eindeutige element-Variable verfügen.When you nest loops, each loop must have a unique element variable.

Sie können auch verschiedene Arten von Steuerungsstrukturen ineinander schachteln.You can also nest different kinds of control structures within each other. Weitere Informationen finden Sie unter Struktur von Struktur SteuerElementen.For more information, see Nested Control Structures.

Exit for und Continue fürExit For and Continue For

Die Exit for -Anweisung bewirkt, dass die Ausführung den For... Next beendet.The Exit For statement causes execution to exit the ForNext -Schleife und überträgt die Steuerung an die-Anweisung, die auf die-Anweisung Next folgt.loop and transfers control to the statement that follows the Next statement.

Die Continue For-Anweisung überträgt die Steuerung sofort an die nächste Iterations Schleife.The Continue For statement transfers control immediately to the next iteration of the loop. Weitere Informationen finden Sie unter Continue-Anweisung.For more information, see Continue Statement.

Im folgenden Beispiel wird gezeigt, wie die Anweisungen Continue For und Exit For verwendet werden.The following example shows how to use the Continue For and Exit For statements.

Dim numberSeq() As Integer =
    {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

For Each number As Integer In numberSeq
    ' If number is between 5 and 7, continue
    ' with the next iteration.
    If number >= 5 And number <= 8 Then
        Continue For
    End If

    ' Display the number.
    Debug.Write(number.ToString & " ")

    ' If number is 10, exit the loop.
    If number = 10 Then
        Exit For
    End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10

Sie können eine beliebige Anzahl von Exit For-Anweisungen in einer For Each-Schleife platzieren.You can put any number of Exit For statements in a For Each loop. Bei Verwendung in geschachtelten For Each-Schleifen bewirkt Exit For, dass die Ausführung die innerste Schleife verlässt und die Steuerung an die nächsthöhere Schachtelungs Ebene überträgt.When used within nested For Each loops, Exit For causes execution to exit the innermost loop and transfers control to the next higher level of nesting.

Exit For wird häufig nach der Auswertung einer Bedingung verwendet, z. b. in einer If... Then... Else-Struktur.Exit For is often used after an evaluation of some condition, for example, in an If...Then...Else structure. Möglicherweise möchten Sie Exit For für die folgenden Bedingungen verwenden:You might want to use Exit For for the following conditions:

  • Das Fortsetzen der durchlaufen ist unnötig oder unmöglich.Continuing to iterate is unnecessary or impossible. Dies kann durch einen fehlerhaften Wert oder eine Beendigungs Anforderung verursacht werden.This might be caused by an erroneous value or a termination request.

  • Eine Ausnahme wird in einem Try... Catch... Finally abgefangen. Sie können Exit For am Ende des Finally-Blocks verwenden.An exception is caught in a Try...Catch...Finally. You might use Exit For at the end of the Finally block.

  • Es gibt eine Endlosschleife, bei der es sich um eine Schleife handelt, die eine große oder sogar unendliche Anzahl von Zeiten ausführen kann.There an endless loop, which is a loop that could run a large or even infinite number of times. Wenn eine solche Bedingung erkannt wird, können Sie Exit For verwenden, um die Schleife mit Escapezeichen zu versehen.If you detect such a condition, you can use Exit For to escape the loop. Weitere Informationen finden Sie unter Do... Loop-Anweisung.For more information, see Do...Loop Statement.

IteratorsIterators

Sie verwenden einen Iterator , um eine benutzerdefinierte iterierung für eine Auflistung auszuführen.You use an iterator to perform a custom iteration over a collection. Ein Iterator kann eine Funktion oder ein Get-Accessor sein.An iterator can be a function or a Get accessor. Es wird eine Yield-Anweisung verwendet, um jedes Element der Auflistung einzeln zurückzugeben.It uses a Yield statement to return each element of the collection one at a time.

Ein Iterator wird mithilfe einer For Each...Next-Anweisung aufgerufen.You call an iterator by using a For Each...Next statement. Jede Iteration der For Each-Schleife ruft den Iterator auf.Each iteration of the For Each loop calls the iterator. Wenn eine Yield-Anweisung im Iterator erreicht wird, wird der Ausdruck in der Yield-Anweisung zurückgegeben, und die aktuelle Position im Code wird beibehalten.When a Yield statement is reached in the iterator, the expression in the Yield statement is returned, and the current location in code is retained. Wenn der Iterator das nächste Mal aufgerufen wird, wird die Ausführung von dieser Position neu gestartet.Execution is restarted from that location the next time that the iterator is called.

Im folgenden Beispiel wird eine Iteratorfunktion verwendet.The following example uses an iterator function. Die Iteratorfunktion weist eine Yield-Anweisung auf, die sich innerhalb einer for... Nächste Schleife.The iterator function has a Yield statement that's inside a For…Next loop. In der ListEvenNumbers-Methode erstellt jede Iterations Methode des For Each-Anweisungs Texts einen aufzurufenden Iteratorfunktion, der mit der nächsten Yield-Anweisung fortfährt.In the ListEvenNumbers method, each iteration of the For Each statement body creates a call to the iterator function, which proceeds to the next Yield statement.

Public Sub ListEvenNumbers()
    For Each number As Integer In EvenSequence(5, 18)
        Debug.Write(number & " ")
    Next
    Debug.WriteLine("")
    ' Output: 6 8 10 12 14 16 18
End Sub

Private Iterator Function EvenSequence(
ByVal firstNumber As Integer, ByVal lastNumber As Integer) _
As System.Collections.Generic.IEnumerable(Of Integer)

    ' Yield even numbers in the range.
    For number = firstNumber To lastNumber
        If number Mod 2 = 0 Then
            Yield number
        End If
    Next
End Function

Weitere Informationen finden Sie unter Iteratoren, yield-Anweisungund Iterator.For more information, see Iterators, Yield Statement, and Iterator.

Technische ImplementierungTechnical Implementation

Wenn ein For Each... NextWhen a For EachNext die-Anweisung wird ausgeführt, Visual Basic die Auflistung nur einmal auswertet, bevor die Schleife gestartet wird.statement runs, Visual Basic evaluates the collection only one time, before the loop starts. Wenn der Anweisungsblock element oder group geändert wird, wirken sich diese Änderungen nicht auf die Iterationen der Schleife aus.If your statement block changes element or group, these changes don't affect the iteration of the loop.

Wenn alle Elemente in der Auflistung nacheinander element zugewiesen wurden, wird die For Each-Schleife angehalten, und die Steuerung wird an die Anweisung nach der Next-Anweisung weitergeleitet.When all the elements in the collection have been successively assigned to element, the For Each loop stops and control passes to the statement following the Next statement.

Wenn die Option ableiten auf ON festgelegt ist (die Standardeinstellung), kann der Visual Basic Compiler den Datentyp element ableiten.If Option Infer is on (its default setting), the Visual Basic compiler can infer the data type of element. Wenn Sie deaktiviert ist und element nicht außerhalb der Schleife deklariert wurde, müssen Sie Sie in der For Each-Anweisung deklarieren.If it is off and element hasn't been declared outside the loop, you must declare it in the For Each statement. Um den Datentyp von element explizit zu deklarieren, verwenden Sie eine As-Klausel.To declare the data type of element explicitly, use an As clause. Wenn der Datentyp des Elements nicht außerhalb des For Each... Next-Konstrukts definiert ist, ist sein Bereich der Text der Schleife.Unless the data type of element is defined outside the For Each...Next construct, its scope is the body of the loop. Beachten Sie, dass Sie element nicht sowohl außerhalb als auch innerhalb der Schleife deklarieren können.Note that you cannot declare element both outside and inside the loop.

Sie können optional element in der Next-Anweisung angeben.You can optionally specify element in the Next statement. Dies verbessert die Lesbarkeit des Programms, insbesondere, wenn Sie For Each-Schleifen eingefügt haben.This improves the readability of your program, especially if you have nested For Each loops. Sie müssen dieselbe Variable angeben wie die, die in der entsprechenden For Each-Anweisung angezeigt wird.You must specify the same variable as the one that appears in the corresponding For Each statement.

Sie sollten den Wert von element nicht innerhalb einer Schleife ändern.You might want to avoid changing the value of element inside a loop. Dadurch kann es schwieriger sein, den Code zu lesen und zu debuggen.Doing this can make it more difficult to read and debug your code. Wenn Sie den Wert group ändern, wirkt sich dies nicht auf die Auflistung oder die zugehörigen Elemente aus, die beim ersten eingeben der Schleife festgelegt wurden.Changing the value of group doesn't affect the collection or its elements, which were determined when the loop was first entered.

Wenn Sie Schachtelungs Schleifen verwenden, signalisiert der Compiler einen Fehler, wenn eine Next-Anweisung einer äußeren Schachtelungs Ebene vor der Next einer inneren Ebene gefunden wird.When you're nesting loops, if a Next statement of an outer nesting level is encountered before the Next of an inner level, the compiler signals an error. Der Compiler kann diesen überlappenden Fehler jedoch nur erkennen, wenn Sie in jeder Next-Anweisung element angeben.However, the compiler can detect this overlapping error only if you specify element in every Next statement.

Wenn Ihr Code davon abhängt, eine Auflistung in einer bestimmten Reihenfolge zu durchlaufen, ist eine For Each... Next-Schleife nicht die beste Wahl, es sei denn, Sie kennen die Merkmale des Enumeratorobjekts, das die Auflistung verfügbar macht.If your code depends on traversing a collection in a particular order, a For Each...Next loop isn't the best choice, unless you know the characteristics of the enumerator object the collection exposes. Die Reihenfolge des Durchlaufs wird nicht durch Visual Basic bestimmt, sondern durch die MoveNext-Methode des Enumeratorobjekts.The order of traversal isn't determined by Visual Basic, but by the MoveNext method of the enumerator object. Daher können Sie möglicherweise nicht vorhersagen, welches Element der Auflistung das erste ist, das in element zurückgegeben wird, oder das nächste Element, das nach einem bestimmten Element zurückgegeben wird.Therefore, you might not be able to predict which element of the collection is the first to be returned in element, or which is the next to be returned after a given element. Mit einer anderen Schleifen Struktur, wie z. b. For... Next oder Do... Loop, erzielen Sie möglicherweise zuverlässigere Ergebnisse.You might achieve more reliable results using a different loop structure, such as For...Next or Do...Loop.

Die Laufzeit muss in der Lage sein, die Elemente in group in element zu konvertieren.The runtime must be able to convert the elements in group to element. Die [Option Strict]-Anweisung steuert, ob erweiternde und einschränkende Konvertierungen zulässig sind (Option Strict ist off, der Standardwert) oder ob nur Erweiterungs Konvertierungen zulässig sind (Option Strict ist aktiviert).The [Option Strict] statement controls whether both widening and narrowing conversions are allowed (Option Strict is off, its default value), or whether only widening conversions are allowed (Option Strict is on). Weitere Informationen finden Sie unter einschränkende Konvertierungen.For more information, see Narrowing conversions.

Der Datentyp von group muss ein Verweistyp sein, der auf eine Auflistung oder ein Array verweist, das Aufzähl Bar ist.The data type of group must be a reference type that refers to a collection or an array that's enumerable. In der Regel bedeutet dies, dass sich group auf ein Objekt bezieht, das die IEnumerable-Schnittstelle des System.Collections-Namespace oder die IEnumerable<T>-Schnittstelle des System.Collections.Generic-Namespace implementiert.Most commonly this means that group refers to an object that implements the IEnumerable interface of the System.Collections namespace or the IEnumerable<T> interface of the System.Collections.Generic namespace. System.Collections.IEnumerable definiert die GetEnumerator-Methode, die ein Enumeratorobjekt für die Auflistung zurückgibt.System.Collections.IEnumerable defines the GetEnumerator method, which returns an enumerator object for the collection. Das Enumeratorobjekt implementiert die System.Collections.IEnumerator-Schnittstelle des System.Collections-Namespace und macht die Current-Eigenschaft sowie die Methoden Reset und MoveNext verfügbar.The enumerator object implements the System.Collections.IEnumerator interface of the System.Collections namespace and exposes the Current property and the Reset and MoveNext methods. Visual Basic verwendet diese, um die Auflistung zu durchlaufen.Visual Basic uses these to traverse the collection.

EingrenzungskonvertierungenNarrowing Conversions

Wenn Option Strict auf On festgelegt ist, verursachen einschränkende Konvertierungen normalerweise Compilerfehler.When Option Strict is set to On, narrowing conversions ordinarily cause compiler errors. In einer For Each-Anweisung werden allerdings Konvertierungen von Elementen in group in element zur Laufzeit ausgewertet und ausgeführt, und Compilerfehler, die durch einschränkende Konvertierungen verursacht werden, werden unterdrückt.In a For Each statement, however, conversions from the elements in group to element are evaluated and performed at run time, and compiler errors caused by narrowing conversions are suppressed.

Im folgenden Beispiel wird die Zuweisung von m als Anfangswert für n nicht kompiliert, wenn Option Strict auf ON fest steht, da die Konvertierung einer Long in eine Integer eine einschränkende Konvertierung ist.In the following example, the assignment of m as the initial value for n doesn't compile when Option Strict is on because the conversion of a Long to an Integer is a narrowing conversion. In der For Each-Anweisung wird jedoch kein Compilerfehler gemeldet, obwohl die Zuweisung zu number dieselbe Konvertierung von Long in Integer erfordert.In the For Each statement, however, no compiler error is reported, even though the assignment to number requires the same conversion from Long to Integer. In der For Each-Anweisung, die eine große Zahl enthält, tritt ein Laufzeitfehler auf, wenn ToInteger auf die große Zahl angewendet wird.In the For Each statement that contains a large number, a run-time error occurs when ToInteger is applied to the large number.

Option Strict On

Module Module1
    Sub Main()
        ' The assignment of m to n causes a compiler error when 
        ' Option Strict is on.
        Dim m As Long = 987
        'Dim n As Integer = m

        ' The For Each loop requires the same conversion but
        ' causes no errors, even when Option Strict is on.
        For Each number As Integer In New Long() {45, 3, 987}
            Console.Write(number & " ")
        Next
        Console.WriteLine()
        ' Output: 45 3 987

        ' Here a run-time error is raised because 9876543210
        ' is too large for type Integer.
        'For Each number As Integer In New Long() {45, 3, 9876543210}
        '    Console.Write(number & " ")
        'Next

        Console.ReadKey()
    End Sub
End Module

IEnumerator-AufrufeIEnumerator Calls

Wenn die Ausführung einer For Each... Next-Schleife gestartet wird, überprüft Visual Basic, ob group auf ein gültiges Auflistungs Objekt verweist.When execution of a For Each...Next loop starts, Visual Basic verifies that group refers to a valid collection object. Wenn dies nicht der Fall ist, wird eine Ausnahme ausgelöst.If not, it throws an exception. Andernfalls werden die MoveNext-Methode und die Current-Eigenschaft des Enumeratorobjekts aufgerufen, um das erste Element zurückzugeben.Otherwise, it calls the MoveNext method and the Current property of the enumerator object to return the first element. Wenn MoveNext angibt, dass kein nächstes Element vorhanden ist, d. h., wenn die Auflistung leer ist, wird die For Each-Schleife angehalten, und die Steuerung wird an die Anweisung nach der Next-Anweisung weitergeleitet.If MoveNext indicates that there is no next element, that is, if the collection is empty, the For Each loop stops and control passes to the statement following the Next statement. Andernfalls legt Visual Basic element auf das erste Element fest und führt den Anweisungsblock aus.Otherwise, Visual Basic sets element to the first element and runs the statement block.

Jedes Mal, wenn Visual Basic auf die Next-Anweisung stößt, wird die Anweisung For Each zurückgegeben.Each time Visual Basic encounters the Next statement, it returns to the For Each statement. Auch hier werden MoveNext und Current aufgerufen, um das nächste Element zurückzugeben, und es wird entweder der Block ausgeführt oder die Schleife abhängig vom Ergebnis angehalten.Again it calls MoveNext and Current to return the next element, and again it either runs the block or stops the loop depending on the result. Dieser Prozess wird fortgesetzt, bis MoveNext angibt, dass kein nächstes Element vorhanden ist oder eine Exit For-Anweisung gefunden wurde.This process continues until MoveNext indicates that there is no next element or an Exit For statement is encountered.

Ändern der Auflistung.Modifying the Collection. Das von GetEnumerator zurückgegebene Enumeratorobjekt ermöglicht es Ihnen nicht, die Auflistung zu ändern, indem Sie Elemente hinzufügen, löschen, ersetzen oder neu anordnen.The enumerator object returned by GetEnumerator normally doesn't let you change the collection by adding, deleting, replacing, or reordering any elements. Wenn Sie die Sammlung nach dem Initiieren einer For Each... Next-Schleife ändern, wird das Enumeratorobjekt ungültig, und der nächste Versuch, auf ein Element zuzugreifen, verursacht eine InvalidOperationException-Ausnahme.If you change the collection after you have initiated a For Each...Next loop, the enumerator object becomes invalid, and the next attempt to access an element causes an InvalidOperationException exception.

Diese Blockierung der Änderung wird jedoch nicht durch Visual Basic bestimmt, sondern durch die Implementierung der IEnumerable-Schnittstelle.However, this blocking of modification isn't determined by Visual Basic, but rather by the implementation of the IEnumerable interface. Es ist möglich, IEnumerable auf eine Weise zu implementieren, die während der Iterations Änderung geändert werden kann.It is possible to implement IEnumerable in a way that allows for modification during iteration. Wenn Sie diese dynamische Änderung in Erwägung ziehen, sollten Sie sicherstellen, dass Sie die Merkmale der IEnumerable-Implementierung in der von Ihnen verwendeten Sammlung verstanden haben.If you are considering doing such dynamic modification, make sure that you understand the characteristics of the IEnumerable implementation on the collection you are using.

Ändern von Auflistungs Elementen.Modifying Collection Elements. Die Current-Eigenschaft des Enumeratorobjekts ist schreibgeschützt, und es wird einelokale Kopie der einzelnen Auflistungs Elemente zurückgegeben.The Current property of the enumerator object is ReadOnly, and it returns a local copy of each collection element. Dies bedeutet, dass Sie die Elemente selbst in einer For Each... Next-Schleife nicht ändern können.This means that you cannot modify the elements themselves in a For Each...Next loop. Änderungen, die Sie vornehmen, wirken sich nur auf die lokale Kopie von Current aus und werden nicht wieder in die zugrunde liegende Auflistung übernommen.Any modification you make affects only the local copy from Current and isn't reflected back into the underlying collection. Wenn ein Element jedoch ein Verweistyp ist, können Sie die Member der Instanz ändern, auf die es verweist.However, if an element is a reference type, you can modify the members of the instance to which it points. Im folgenden Beispiel wird der BackColor-Member jedes thisControl-Elements geändert.The following example modifies the BackColor member of each thisControl element. Es ist jedoch nicht möglich, thisControl selbst zu ändern.You cannot, however, modify thisControl itself.

Sub LightBlueBackground(thisForm As System.Windows.Forms.Form)
    For Each thisControl In thisForm.Controls
        thisControl.BackColor = System.Drawing.Color.LightBlue
    Next thisControl
End Sub

Im vorherigen Beispiel kann der BackColor-Member jedes thisControl-Elements geändert werden, obwohl es nicht möglich ist, thisControl selbst zu ändern.The previous example can modify the BackColor member of each thisControl element, although it cannot modify thisControl itself.

Durchlaufen von Arrays.Traversing Arrays. Da die Array-Klasse die IEnumerable-Schnittstelle implementiert, machen alle Arrays die GetEnumerator-Methode verfügbar.Because the Array class implements the IEnumerable interface, all arrays expose the GetEnumerator method. Dies bedeutet, dass Sie ein Array mit einer For Each... Next-Schleife durchlaufen können.This means that you can iterate through an array with a For Each...Next loop. Sie können jedoch nur die Array Elemente lesen.However, you can only read the array elements. Diese können nicht geändert werden.You cannot change them.

BeispielExample

Im folgenden Beispiel werden alle Ordner in C:\ aufgelistet. Verzeichnis mit der DirectoryInfo-Klasse.The following example lists all the folders in the C:\ directory by using the DirectoryInfo class.

Dim dInfo As New System.IO.DirectoryInfo("c:\")
For Each dir As System.IO.DirectoryInfo In dInfo.GetDirectories()
    Debug.WriteLine(dir.Name)
Next

BeispielExample

Das folgende Beispiel zeigt ein Verfahren zum Sortieren einer Auflistung.The following example illustrates a procedure for sorting a collection. Im Beispiel werden Instanzen einer Car-Klasse sortiert, die in einem List<T> gespeichert sind.The example sorts instances of a Car class that are stored in a List<T>. Die Car-Klasse implementiert die IComparable<T>-Schnittstelle, die die Implementierung der CompareTo-Methode erfordert.The Car class implements the IComparable<T> interface, which requires that the CompareTo method be implemented.

Jeder Aufrufe der CompareTo-Methode führt einen einzelnen Vergleich aus, der für die Sortierung verwendet wird.Each call to the CompareTo method makes a single comparison that's used for sorting. Vom Benutzer erstellter Code in der CompareTo-Methode gibt einen Wert für jeden Vergleich des aktuellen Objekts mit einem anderen Objekt zurück.User-written code in the CompareTo method returns a value for each comparison of the current object with another object. Der zurückgegebene Wert ist kleiner als Null, wenn das aktuelle Objekt kleiner ist als das andere Objekt, größer als Null, wenn das aktuelle Objekt größer als das andere Objekt ist und Null, wenn beide Objekt gleich groß sind.The value returned is less than zero if the current object is less than the other object, greater than zero if the current object is greater than the other object, and zero if they are equal. Dies ermöglicht es Ihnen, in dem Code die Kriterien für größer als, kleiner als und gleich zu definieren.This enables you to define in code the criteria for greater than, less than, and equal.

In der ListCars-Methode sortiert die cars.Sort()-Anweisung die Liste.In the ListCars method, the cars.Sort() statement sorts the list. Dieser Aufruf der Sort-Methode von List<T> führt dazu, dass die CompareTo-Methode für die Car-Objekte in der List automatisch aufgerufen wird.This call to the Sort method of the List<T> causes the CompareTo method to be called automatically for the Car objects in the List.

Public Sub ListCars()

    ' Create some new cars.
    Dim cars As New List(Of Car) From
    {
        New Car With {.Name = "car1", .Color = "blue", .Speed = 20},
        New Car With {.Name = "car2", .Color = "red", .Speed = 50},
        New Car With {.Name = "car3", .Color = "green", .Speed = 10},
        New Car With {.Name = "car4", .Color = "blue", .Speed = 50},
        New Car With {.Name = "car5", .Color = "blue", .Speed = 30},
        New Car With {.Name = "car6", .Color = "red", .Speed = 60},
        New Car With {.Name = "car7", .Color = "green", .Speed = 50}
    }

    ' Sort the cars by color alphabetically, and then by speed
    ' in descending order.
    cars.Sort()

    ' View all of the cars.
    For Each thisCar As Car In cars
        Debug.Write(thisCar.Color.PadRight(5) & " ")
        Debug.Write(thisCar.Speed.ToString & " ")
        Debug.Write(thisCar.Name)
        Debug.WriteLine("")
    Next

    ' Output:
    '  blue  50 car4
    '  blue  30 car5
    '  blue  20 car1
    '  green 50 car7
    '  green 10 car3
    '  red   60 car6
    '  red   50 car2
End Sub

Public Class Car
    Implements IComparable(Of Car)

    Public Property Name As String
    Public Property Speed As Integer
    Public Property Color As String

    Public Function CompareTo(ByVal other As Car) As Integer _
        Implements System.IComparable(Of Car).CompareTo
        ' A call to this method makes a single comparison that is
        ' used for sorting.

        ' Determine the relative order of the objects being compared.
        ' Sort by color alphabetically, and then by speed in
        ' descending order.

        ' Compare the colors.
        Dim compare As Integer
        compare = String.Compare(Me.Color, other.Color, True)

        ' If the colors are the same, compare the speeds.
        If compare = 0 Then
            compare = Me.Speed.CompareTo(other.Speed)

            ' Use descending order for speed.
            compare = -compare
        End If

        Return compare
    End Function
End Class

Siehe auchSee also