For Each...Next 문(Visual Basic)For Each...Next Statement (Visual Basic)

컬렉션의 각 요소에 대해 문 그룹을 반복 합니다.Repeats a group of statements for each element in a collection.

구문Syntax

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

요소Parts

용어Term 정의Definition
element For Each 문에 필요 합니다.Required in the For Each statement. Next 문에서 선택적입니다.Optional in the Next statement. 변수.Variable. 컬렉션의 요소를 반복 하는 데 사용 됩니다.Used to iterate through the elements of the collection.
datatype 가 on Option Infer (기본값) 이거나 element 이미 선언 된 경우 선택 사항입니다 .가 Option Infer off이 고 element 아직 선언 되지 않은 경우에는 필수입니다.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. element의 데이터 형식입니다.The data type of element.
group 필수 요소.Required. 컬렉션 형식 또는 개체인 형식의 변수입니다.A variable with a type that's a collection type or Object. 가 반복 될 컬렉션 statements 을 참조 합니다.Refers to the collection over which the statements are to be repeated.
statements 선택 사항입니다.Optional. 에서 Next For Eachgroup항목에 대해 실행 되는 하나 이상의 문입니다.One or more statements between For Each and Next that run on each item in group.
Continue For 선택 사항입니다.Optional. For Each 루프의 시작 부분으로 제어를 전달 합니다.Transfers control to the start of the For Each loop.
Exit For 선택 사항입니다.Optional. For Each 루프 외부로 제어를 전달 합니다.Transfers control out of the For Each loop.
Next 필수 요소.Required. For Each 루프의 정의를 종료 합니다.Terminates the definition of the For Each loop.

간단한 예Simple Example

For Each사용 ... Next 컬렉션 또는 배열의 각 요소에 대해 문 집합을 반복 하려는 경우 루프를 실행 합니다.Use a For Each...Next loop when you want to repeat a set of statements for each element of a collection or array.

... 다음 문은 루프의 각 반복을 컨트롤 변수와 연결 하 고 해당 변수의 초기 및 최종 값을 결정할 수 있는 경우에 효과적입니다.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. 그러나 컬렉션을 처리할 때 초기 및 최종 값의 개념은 의미가 없으며 컬렉션에 포함 된 요소의 수를 반드시 알아야 하는 것은 아닙니다.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. 이러한 종류의 경우 For Each... Next 루프를 선택 하는 것이 더 좋은 경우도 있습니다.In this kind of case, a For Each...Next loop is often a better choice.

다음 예제 For Each에서 ...NextIn the following example, the For EachNext 문은 목록 컬렉션의 모든 요소를 반복 합니다.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

더 많은 예제는 컬렉션배열을 참조 하세요.For more examples, see Collections and Arrays.

중첩 루프Nested Loops

루프 하나를 For Each 다른 루프에 배치 하 여 루프를 중첩할 수 있습니다.You can nest For Each loops by putting one loop within another.

다음 예제에서는 중첩 For Each된 ...NextThe following example demonstrates nested For EachNext 구조물.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 

루프를 중첩할 때 각 루프에는 고유한 element 변수가 있어야 합니다.When you nest loops, each loop must have a unique element variable.

서로 다른 종류의 제어 구조를 중첩할 수도 있습니다.You can also nest different kinds of control structures within each other. 자세한 내용은 중첩 컨트롤 구조를 참조 하세요.For more information, see Nested Control Structures.

종료 및 계속Exit For and Continue For

문에 대 한 exit 로 인해 실행이 종료 For됩니다.NextThe Exit For statement causes execution to exit the ForNext 루프를 실행 하 고 Next 문 뒤의 문으로 제어를 전달 합니다.loop and transfers control to the statement that follows the Next statement.

Continue For 문은 루프의 다음 반복으로 제어를 즉시 전송 합니다.The Continue For statement transfers control immediately to the next iteration of the loop. 자세한 내용은 Continue 문을 참조 하세요.For more information, see Continue Statement.

다음 예제에서는 Continue ForExit For 문을 사용 하는 방법을 보여 줍니다.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

루프에 원하는 수의 Exit For 문을 넣을 수 있습니다. For EachYou can put any number of Exit For statements in a For Each loop. 중첩 For Each 된 루프 내에서 사용 Exit For 되는 경우 실행이 가장 안쪽의 루프를 종료 하 고 다음으로 높은 중첩 수준으로 제어를 전달 합니다.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는 경우에 따라 일부 조건을 평가한 후에 If사용 됩니다. 예를 들어 ... Then... Else 구조.Exit For is often used after an evaluation of some condition, for example, in an If...Then...Else structure. 다음 조건에 대해를 Exit For 사용 하는 것이 좋습니다.You might want to use Exit For for the following conditions:

  • 계속 반복은 불필요 하거나 불가능 합니다.Continuing to iterate is unnecessary or impossible. 이 오류는 잘못 된 값 이나 종료 요청으로 인해 발생할 수 있습니다.This might be caused by an erroneous value or a termination request.

  • 예외가 catch Try... Catch... Finally. 블록의 끝 Exit For 에를 사용할 수 있습니다. FinallyAn exception is caught in a Try...Catch...Finally. You might use Exit For at the end of the Finally block.

  • 무한 하거나 무한 한 횟수를 실행 하는 루프 인 무한 루프가 있습니다.There an endless loop, which is a loop that could run a large or even infinite number of times. 이러한 조건을 감지한 경우를 사용 Exit For 하 여 루프를 이스케이프할 수 있습니다.If you detect such a condition, you can use Exit For to escape the loop. 자세한 내용은 다음 을 참조 하세요. Loop 문.For more information, see Do...Loop Statement.

반복기Iterators

반복기 를 사용 하 여 컬렉션에 대해 사용자 지정 반복을 수행 합니다.You use an iterator to perform a custom iteration over a collection. 반복기는 함수 또는 Get 접근자 일 수 있습니다.An iterator can be a function or a Get accessor. Yield 문을 사용 하 여 컬렉션의 각 요소를 한 번에 하나씩 반환 합니다.It uses a Yield statement to return each element of the collection one at a time.

For Each...Next 문을 사용 하 여 반복기를 호출 합니다.You call an iterator by using a For Each...Next statement. 각각의 For Each 루프의 반복이 반복기를 호출합니다.Each iteration of the For Each loop calls the iterator. Yield 반복기에서 Yield 문에 도달 하면 문의 식이 반환 되 고 코드에서 현재 위치는 유지 됩니다.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. 다음에 반복기가 호출되면 해당 위치에서 실행이 다시 시작됩니다.Execution is restarted from that location the next time that the iterator is called.

다음 예제에서는 반복기 함수를 사용 합니다.The following example uses an iterator function. 반복기 함수 Yield 에는 에 대 한 다음의 문이 있습니다. Next 루프.The iterator function has a Yield statement that's inside a For…Next loop. 메서드에서 문 본문을 반복할 Yield 때마다 다음 문으로 진행 하는 반복기 함수에 대 한 호출이 생성 됩니다. For Each ListEvenNumbersIn 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

자세한 내용은 반복기, Yield 문반복기를 참조 하세요.For more information, see Iterators, Yield Statement, and Iterator.

기술 구현Technical Implementation

For Each...NextWhen a For EachNext 문이 실행 되 고, Visual Basic는 루프가 시작 되기 전에 컬렉션을 한 번만 계산 합니다.statement runs, Visual Basic evaluates the collection only one time, before the loop starts. 문 블록이 또는 group을 변경 element 하는 경우 이러한 변경 내용은 루프 반복에 영향을 주지 않습니다.If your statement block changes element or group, these changes don't affect the iteration of the loop.

컬렉션의 모든 요소를에 연속적으로 element For Each 할당 하면 루프가 중지 되 고 Next 문 다음에 오는 문으로 제어가 전달 됩니다.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.

유추 옵션 (기본 설정)이 설정 된 경우 Visual Basic 컴파일러는의 element데이터 형식을 유추할 수 있습니다.If Option Infer is on (its default setting), the Visual Basic compiler can infer the data type of element. 해제 되어 있고 element 루프 외부에서 선언 되지 않은 경우에는 For Each 문에서 선언 해야 합니다.If it is off and element hasn't been declared outside the loop, you must declare it in the For Each statement. 데이터 형식을 element 명시적으로 선언 하려면 As 절을 사용 합니다.To declare the data type of element explicitly, use an As clause. 요소의 데이터 형식이 외부에서 For Each정의 되지 않은 경우 Next 생성자의 범위는 루프의 본문입니다.Unless the data type of element is defined outside the For Each...Next construct, its scope is the body of the loop. 루프의 외부 및 내부 element 에서 모두 선언할 수 없습니다.Note that you cannot declare element both outside and inside the loop.

Next 문에서 선택적으로 지정할 element 수 있습니다.You can optionally specify element in the Next statement. 이렇게 하면 특히 루프가 중첩 For Each 된 경우 프로그램의 가독성을 향상 시킬 수 있습니다.This improves the readability of your program, especially if you have nested For Each loops. 해당 For Each 문에 표시 되는 변수와 동일한 변수를 지정 해야 합니다.You must specify the same variable as the one that appears in the corresponding For Each statement.

루프 element 내에서 값을 변경 하지 않는 것이 좋습니다.You might want to avoid changing the value of element inside a loop. 이렇게 하면 코드를 읽고 디버그 하기가 더 어려워질 수 있습니다.Doing this can make it more difficult to read and debug your code. group 값을 변경 해도 컬렉션 또는 해당 요소에는 영향을 주지 않습니다 .이는 루프를 처음 입력할 때 결정 되었습니다.Changing the value of group doesn't affect the collection or its elements, which were determined when the loop was first entered.

루프를 중첩 하는 경우 외부 중첩 Next 수준의 문이 내부 수준의 Next 보다 먼저 발견 되 면 컴파일러는 오류를 표시 합니다.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. 그러나 컴파일러는 모든 element Next 문에서를 지정 하는 경우에만 이러한 중복 오류를 감지할 수 있습니다.However, the compiler can detect this overlapping error only if you specify element in every Next statement.

코드가 특정 순서로 컬렉션을 탐색 하는 데 종속 되는 For Each경우 ... Next 컬렉션에서 노출 하는 열거자 개체의 특성을 모르는 경우 루프는 최상의 선택이 아닙니다.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. 순회 순서는 Visual Basic에 의해 결정 되지 않지만 열거자 개체의 MoveNext 메서드에 의해 결정 됩니다.The order of traversal isn't determined by Visual Basic, but by the MoveNext method of the enumerator object. 따라서 컬렉션에서 반환 element되는 첫 번째 요소 또는 지정 된 요소 뒤에 반환 되는 다음의 요소를 예측할 수 없습니다.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. ...과 For같은 다른 루프 구조를 사용 하 여 보다 안정적인 결과를 달성할 수 있습니다. Next 또는 ...Do Loop.You might achieve more reliable results using a different loop structure, such as For...Next or Do...Loop.

런타임은의 group 요소를로 element변환할 수 있어야 합니다.The runtime must be able to convert the elements in group to element. [@No__t-0] 문은 확대 변환과 축소 변환이 모두 허용 되는지 여부를 제어 합니다 (Option Strict은 off, 기본값은 off) 또는 확대 변환만 허용 되는지 여부를 제어 합니다 (Option Strict가 on으로 설정 됨).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). 자세한 내용은 축소 변환을 참조 하세요.For more information, see Narrowing conversions.

group 데이터 형식은 열거 가능한 컬렉션 또는 배열을 참조 하는 참조 형식 이어야 합니다.The data type of group must be a reference type that refers to a collection or an array that's enumerable. 가장 일반적 group 으로는 네임 스페이스의 IEnumerable 인터페이스 System.Collections 또는 IEnumerable<T> System.Collections.Generic 네임 스페이스의 인터페이스를 구현 하는 개체를 참조 합니다.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컬렉션에 대 한 열거자 개체를 반환 하는 메서드를정의합니다.GetEnumeratorSystem.Collections.IEnumerable defines the GetEnumerator method, which returns an enumerator object for the collection. 열거자 개체는 System.Collections 네임 스페이스 System.Collections.IEnumerator 의 인터페이스를 구현 하 고 Current 속성과 ResetMoveNext 메서드를 노출 합니다.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는이를 사용 하 여 컬렉션을 트래버스 합니다.Visual Basic uses these to traverse the collection.

축소 변환Narrowing Conversions

Option StrictOn설정 된 경우 축소 변환은 일반적으로 컴파일러 오류를 발생 시킵니다.When Option Strict is set to On, narrowing conversions ordinarily cause compiler errors. 그러나 문에서의 group 요소를로 element 변환 하는 것은 런타임에 계산 되어 수행 되며 축소 변환으로 인 한 컴파일러 오류가 표시 되지 않습니다. For EachIn 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.

다음 예제에서에 m 대 한 n 초기 값으로의 할당은가 Integer 설정 되어 있을 Option Strict 때 컴파일되지 않습니다 .를 Long 로 변환 하는 것은 축소 변환입니다.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. 그러나에 대 number 한 할당에에서 Long Integer와 동일한 변환이 필요 하지만, 문에서컴파일러오류가보고되지않습니다.For EachIn the For Each statement, however, no compiler error is reported, even though the assignment to number requires the same conversion from Long to Integer. 많은 수를 포함 하는 ToInteger 문에서를많은수에적용하면런타임오류가발생합니다.For EachIn 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 호출IEnumerator Calls

실행 중 For Each... 루프를 시작 하 고 Visual Basic group 유효한 컬렉션 개체를 참조 하는지 확인 합니다. NextWhen execution of a For Each...Next loop starts, Visual Basic verifies that group refers to a valid collection object. 그렇지 않으면 예외를 throw 합니다.If not, it throws an exception. 그렇지 않으면 열거자 개체의 MoveNext 메서드 Current 및 속성을 호출 하 여 첫 번째 요소를 반환 합니다.Otherwise, it calls the MoveNext method and the Current property of the enumerator object to return the first element. 가 다음 요소가 없다는 것을 For Each Next 나타냅니다.즉,컬렉션이비어있으면루프가중단되고문뒤의문으로MoveNext 제어가 전달 됩니다.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. 그렇지 않으면 Visual Basic를 element 첫 번째 요소로 설정 하 고 문 블록을 실행 합니다.Otherwise, Visual Basic sets element to the first element and runs the statement block.

Next 문이 Visual Basic 때마다 For Each 문으로 돌아갑니다.Each time Visual Basic encounters the Next statement, it returns to the For Each statement. 그런 다음 및 MoveNext Current 를 호출 하 여 다음 요소를 반환 하 고, 결과에 따라 블록을 실행 하거나 루프를 중지 합니다.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. 이 프로세스는 다음 MoveNext 요소가 없다는 것을 표시 Exit For 하거나 문이 발견 될 때까지 계속 됩니다.This process continues until MoveNext indicates that there is no next element or an Exit For statement is encountered.

컬렉션을 수정 합니다.Modifying the Collection. GetEnumerator 일반적으로 반환 되는 열거자 개체는 요소를 추가, 삭제, 바꾸기 또는 다시 정렬 하 여 컬렉션을 변경할 수 없습니다.The enumerator object returned by GetEnumerator normally doesn't let you change the collection by adding, deleting, replacing, or reordering any elements. For Each시작한 후 컬렉션을 변경 하는 경우 루프, 열거자 개체가 유효 하지 않게 되 고, 다음에 요소 InvalidOperationException 에 액세스 하려고 하면 예외가 발생 합니다. NextIf 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.

그러나 이러한 수정 내용은 Visual Basic에 의해 결정 되는 것이 아니라 IEnumerable 인터페이스의 구현에 의해 결정 됩니다.However, this blocking of modification isn't determined by Visual Basic, but rather by the implementation of the IEnumerable interface. 반복 중에 수정할 수 IEnumerable 있는 방법으로를 구현할 수 있습니다.It is possible to implement IEnumerable in a way that allows for modification during iteration. 이러한 동적 수정 작업을 수행 하는 경우 사용 하는 컬렉션에 대 한 IEnumerable 구현의 특징을 이해 해야 합니다.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.

컬렉션 요소 수정Modifying Collection Elements. 열거자 개체의 Current 속성은 ReadOnly이며 각 컬렉션 요소의 로컬 복사본을 반환합니다.The Current property of the enumerator object is ReadOnly, and it returns a local copy of each collection element. 즉, For Each에서 요소 자체를 수정할 수 없습니다. Next 루프.This means that you cannot modify the elements themselves in a For Each...Next loop. 수정한 내용은의 Current 로컬 복사본에만 적용 되 고 기본 컬렉션에는 다시 반영 되지 않습니다.Any modification you make affects only the local copy from Current and isn't reflected back into the underlying collection. 그러나 요소가 참조 형식이 면 요소가 가리키는 인스턴스의 멤버를 수정할 수 있습니다.However, if an element is a reference type, you can modify the members of the instance to which it points. 다음 예제에서는 각 BackColor thisControl 요소의 멤버를 수정 합니다.The following example modifies the BackColor member of each thisControl element. 그러나 자체를 수정할 thisControl 수는 없습니다.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

이전 예제에서는 자체를 수정할 BackColor thisControl 수는 없지만 thisControl 각 요소의 멤버를 수정할 수 있습니다.The previous example can modify the BackColor member of each thisControl element, although it cannot modify thisControl itself.

배열 트래버스.Traversing Arrays. 클래스는 Array IEnumerable 인터페이스를 구현 하므로 모든 배열은 메서드를 GetEnumerator 노출 합니다.Because the Array class implements the IEnumerable interface, all arrays expose the GetEnumerator method. 즉, ...를 For Each사용 하 여 배열을 반복할 수 있습니다. Next 루프.This means that you can iterate through an array with a For Each...Next loop. 그러나 배열 요소만 읽을 수 있습니다.However, you can only read the array elements. 변경할 수 없습니다.You cannot change them.

예제Example

다음 예제에서는 C:\의 모든 폴더를 나열 합니다. 클래스를 사용 하 DirectoryInfo 는 디렉터리입니다.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

예제Example

다음 예제에서는 컬렉션 정렬 절차를 보여 줍니다.The following example illustrates a procedure for sorting a collection. 예제에서는 Car List<T>에 저장 된 클래스의 인스턴스를 정렬 합니다.The example sorts instances of a Car class that are stored in a List<T>. Car 클래스는 CompareTo 메서드가 구현되어야 하는 IComparable<T> 인터페이스를 구현합니다.The Car class implements the IComparable<T> interface, which requires that the CompareTo method be implemented.

CompareTo 메서드를 호출할 때마다 정렬에 사용 되는 단일 비교가 수행 됩니다.Each call to the CompareTo method makes a single comparison that's used for sorting. CompareTo 메서드의 사용자 작성 코드는 다른 개체와 현재 개체의 각 비교에 대한 값을 반환합니다.User-written code in the CompareTo method returns a value for each comparison of the current object with another object. 현재 개체가 다른 개체보다 작으면 반환되는 값이 0보다 작고, 현재 개체가 다른 개체보다 크면 0보다 크고, 같으면 0입니다.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. 이렇게 하면 보다 큼, 보다 작음 및 같음에 대한 조건을 코드에서 정의할 수 있습니다.This enables you to define in code the criteria for greater than, less than, and equal.

ListCars 메서드에서 cars.Sort() 문은 목록을 정렬합니다.In the ListCars method, the cars.Sort() statement sorts the list. List<T>Sort 메서드를 호출하면 ListCar 개체에 대해 CompareTo 메서드가 자동으로 호출됩니다.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

참고자료See also