programing

다음 작업을 수행할 수 있습니까?각각의 루프를 거꾸로?

copysource 2023. 6. 4. 18:32
반응형

다음 작업을 수행할 수 있습니까?각각의 루프를 거꾸로?

저는 이것이 전통적인 방법으로 가능하다고 생각하지 않지만, 다음과 같은 장황한 코드입니다.

For Each s As String In myStringList Step -1
    //' Do stuff here
Next

일반적인 For보다 먼저 myString 개체를 반전해야 할 것입니다.각 루프 맞지요?

아래 Mike의 답변에 언급된 문서는 매우 오해의 소지가 있다고 생각합니다.의 순서For Each컬렉션에 의해 정의됩니다(즉, 구현).IEnumerable/IEnumerable<T>), 하지만 그것은 순서가 중요할 때 사용하면 안 된다고 말하는 것과 같지 않습니다.많은 컬렉션(예: 어레이,List<T>등)는 항상 "자연스러운" 순서로 진행됩니다.

설명서의 일부에서는 다음과 같이 설명합니다.

통과 순서.각 항목에 대해 실행할 때...다음 루프에서는 GetEnumerator 메서드에서 반환된 열거자 개체의 제어 하에 컬렉션의 트래버설이 있습니다.통과 순서는 Visual Basic이 아니라 열거자 개체의 MoveNext 메서드에 의해 결정됩니다.즉, 컬렉션의 어떤 요소가 요소에서 반환되는 첫 번째 요소인지 또는 지정된 요소 다음으로 반환되는 요소인지 예측할 수 없습니다.

이는 신뢰할 수 없다고 말하는 것과 전혀 다릅니다. 반복하는 컬렉션이 원하는 순서로 결과를 산출한다는 것을 알고 있다면 신뢰할 수 있습니다.무작위로 요소를 선택하는 것은 아닙니다.다음과 같은 측면에서의 행동.IEnumerable/IEnumerable<T>이 페이지에 명확하게 정의되어 있습니다.

예측 가능한 순서에 대한 가장 중요한 예외는 사전 및 집합이며, 이는 자연스럽게 순서가 지정되지 않습니다.

되리려면돌을을 하는 IEnumerable<T>사용 - 위치별로 인덱싱된 컬렉션에 대해 역방향으로 반복해야 하는 경우(예: 배열 또는List<T>) )을 이 더 For루프는 끝에서 시작하여 뒤로 작동합니다.

다음과 같은 작업을 수행해야 합니다.

For i as integer = myStringList.Count-1 to 0 step -1
    dim s as string = myStringList.Item(i)
    ' Do your stuff with s
Next i

하지만 제가 알기로는 "For...각각의 "뒤로", 하지만 그것은 몇몇 경우에는 좋을 것입니다.

안타깝게도 For Each의 MSDN 문서에는 반복 순서가 중요하지 않은 경우(순서가 없는 집합 등)에 For Each 구성이 명시적으로 존재한다고 명시되어 있습니다.따라서 안타깝게도 순서가 정의되지 않았기 때문에 각각의 경우를 뒤집는 개념은 없습니다.

행운을 빕니다.

메서드를 호출하여 다음을 가져옵니다.IEnuemrable(Of TSource)열거 가능한 출처의 역순으로.

프레임워크 4의 테스티그, 코드

For Each s As String In myStringList.Reverse
    //' Do stuff here
Next

작동하지 않았습니다. 올바른 방법은 다음과 같습니다.

myStringList.Reverse() ' it is a method not a function
For Each s As String In myStringList
//' Do stuff here
Next

보기: MSDN: 예약

For Each s As String In myStringList.Reverse
    //' Do stuff here
Next

이 작업을 수행할 수 없는 이유는 기본 설계 피쳐로서 For Each가 마지막 요소 없이 열거형에 대해 또는 아직 알 수 없는 마지막 요소로 반복할 수 있기 때문입니다.

효과:

Dim myArray() As String = {"1", "2", "3", "4", "5"}

For Each n As String In myArray.Reverse
    Debug.Print(n)
Next

출력: 5 4 3 2 1

'

이 기능은 다음과 같습니다.

Dim myArray() As String = {"1", "2", "3", "4", "5"}

For i As Integer = myArray.Length - 1 To 0 Step -1
    Debug.Print(myArray(i))
Next

출력: 5 4 3 2 1

이전에 사용했던 각 어레이에 대해 를 사용하여 어레이를 생성한 다음 array.reverse를 사용하고 어레이에서 각 어레이에 대해 를 실행해야 합니다.다 했어요.

건배.

루프 내부에서 발생하는 상황에 따라 작업을 수행할 수 있습니다.대신 At(개체,0)를 삽입합니다.역 열거형과 동일한 결과를 추가하고 생성합니다.

되돌리려는 클래스에 확장 함수를 추가할 수 있습니다.

<Serializable()> Public Class SomeCollection
    Inherits CollectionBase
    Public Sub New()
    End Sub

    Public Sub Add(ByVal Value As Something)
        Me.List.Add(Value)
    End Sub

    Public Sub Remove(ByVal Value As Something)
        Me.List.Remove(Value)
    End Sub

    Public Function Contains(ByVal Value As Something) As Boolean
        Return Me.List.Contains(Value)
    End Function

    Public Function Item(ByVal Index As Integer) As Something
        Return DirectCast(Me.List.Item(Index), Something)
    End Function

    Public Function Reverse() As SomeCollection
        Dim revList As SomeCollection = New SomeCollection()
        For index As Integer = (Me.List.Count - 1) To 0 Step -1
             revList.List.Add(Me.List.Item(index))
        Next
        Return revList
    End Function
End Class

그러면 당신은 그것을 이렇게 부를 것입니다.

For Each s As Something In SomeCollection.Reverse

Next

먼저 각 문에 대한 목록(문자열)을 만들고, 그 다음에는 에 대한 다른 정규문을 만들어야 합니다.step -1 ..다음 문장.예를 참조하십시오.

Dim ff As New List(Of Integer)
For Each rRow As DataRow In DeletedRows
Dim item As Integer
item = rRow.Table.Rows.IndexOf(rRow)
ff.Add(item)
Next
For i As Integer = ff.Count - 1 To 0 Step -1
dim item as integer=ff(i)
next i

그것이 도움이 되기를 바랍니다.

승인된 답변은 그 이유를 설명하지만 키가 있는 컬렉션(SortedList, SortedDictionary, Dictionary 등)에 대해 다른 예제를 추가하면 다음과 같은 작업을 수행할 수 있습니다.

For Each Id as Tkey in MyCollection.Keys.Reverse
   // The item in question is now available as MyCollection(Id)
Next

원하는 항목의 목록을 만들고 루프 수집 단계를 수행합니다.

dim revList as New List (of ToolStripItem)  
For each objItem as ToolStripItem in Menu.DropDownItems
    revList.Add(objItem)
next
revList.reverse ' reverse the order of that list

역순으로 나열된 목록을 단계별로

for each objItem as ToolStripItem in revList   
    ' do whatever (like removing your menu from an ArrayMenu)
next

ToolStripItem 및 Menu를 바꿉니다.필요한 항목을 모두 드롭다운합니다.

언급URL : https://stackoverflow.com/questions/952136/is-it-possible-to-do-a-for-each-loop-backwards

반응형