2009-06-04 7 views
32

나는 이것이 일반적인 방법으로 가능하다고 생각하지 않지만,이 장황한 코드와 같은 것 :For ... Each Loop Backwards를 할 수 있습니까?

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

기존 For..Each 루프보다 먼저 myString 오브젝트를 반전시켜야 할 것입니다.

답변

40

대답에서 언급 한 설명서가 이라고 매우 불만 스럽습니다.입니다. For Each의 주문은 호출 된 컬렉션 (즉, 구현이 IEnumerable/IEnumerable<T>)으로 정의되지만 이 아니고이 아니며 주문이 중요 할 때 사용해서는 안된다는 말과 동일합니다. 많은 컬렉션 (예 : 배열, List<T> 등)은 항상 "자연"순서로 진행됩니다. 문서의

일부는 여기에 암시 않습니다

순회 주문합니다. For Each ... Next 루프를 실행하면 컬렉션의 순회는 GetEnumerator 메서드에서 반환되는 열거 자 개체의 제어를받습니다. 순회의 순서는 Visual Basic에 의해 결정되는 것이 아니라 열거 자 개체의 MoveNext 메서드에 의해 결정됩니다. 이 은 컬렉션의 어떤 요소가 요소 중 첫 번째로 반환되는지 또는 지정된 요소 뒤에 이 반환 될지 다음에 오는 것이므로 을 예측할 수 없음을 의미합니다. 당신이 이상 반복하고 컬렉션이 원하는 순서의 결과를 얻을 수 있음을 알고있는 경우가 에 의존 할 수있다 - 그것은 신뢰할 수 없습니다 말을 모두 같은에서 아닙니다

. 무작위로 요소를 고르는 것과는 다릅니다. IEnumerable/IEnumerable<T>의 동작은 해당 페이지에서 명확하게 정의됩니다.

예측 가능한 순서에 대한 가장 중요한 예외는 사전과 집합이며 자연 순서가 없습니다.

IEnumerable<T>Enumerable.Reverse를 사용합니다 -하지만 (예 : 배열 또는 List<T> 등)의 위치에 의해 색인 된 콜렉션을 통해 역으로 반복해야하는 경우 다음은 For 루프가 시작 사용하는 것이 더 효율적이 될 것입니다 끝내고 거꾸로 작동합니다.

+3

감사합니다. Jon, 귀하의 의견과 통찰력을 얻는 것이 항상 즐거움입니다. D – Anders

+1

왜이 대답이 받아 들여지지 않습니까? 그것은 더 많은 indepth 예 –

+0

@DotNet 프로그래머 : 이것은 내가 진짜 응답 방법을 받아 들일 수 없다는 것을 깨달은 오래된 게시물이었습니다 :) 적절한 크레딧이 주어졌습니다. (존은 어쨌든 더 많은 포인트를 필요로하지 않습니다 : P) – Anders

31

당신은 뭔가를해야 할 것 :

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 

그러나 내가 아는 한, 당신은이 "들어 ... 각각"뒤로, 즉 약간의 좋은 것하지만 할 수 없어 인스턴스.

+0

정확히 무엇을해야으로 Menu.DropDownItems 교체 '역을 통해 단계는

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

목록

를 주문했다'. 나는 단지 VB의 숨겨진 '멋진', 일명 잘 문서화되지 않은 기능을 놓치지 않았 음을 확신하고 있었다. – Anders

+0

이것은 완벽합니다! – GunWanderer

13

슬프게도 MSDN docs on For Each은 반복 순서가 중요하지 않은 경우 (정렬되지 않은 세트 등) For Each 구문이 명시 적으로 존재한다고 명시합니다. 불행히도 For Each를 뒤집는 개념은 없습니다. 왜냐하면 순서는 어쨌든 정의되지 않았기 때문입니다.

행운을 빈다.

+1

나는 이것을 기대하고 있었지만 100 % 확신 할 수는 없으므로 보너스로 확실한 승/참고에 대한 감사를 표한다. – Anders

+0

이것이 맞다 - 나는 항상 "For Each"루프가 순서대로 진행된다고 추측한다. 그렇지, 의지 할 수 없다. 특정 주문을 원하면 배열의 색인 중 "다음에"가 유일한 선택입니다. – SqlRyan

+6

올바른 순서로 반복하여 사용하는 컬렉션을 알고 있다면 * 의존 할 수 있습니다. 예를 들어 배열은 항상 자연 순서대로 반복됩니다. 자세한 내용은 내 대답을 참조하십시오. –

10

열거 형 소스의 역순으로 IEnuemrable(Of TSource)을 얻으려면 System.Linq.Enumerable.Reverse 메서드를 호출하십시오.

+0

그래, 내가 그 일을 끝내야 할거야. 감사! – Anders

+0

MSDN 예제가 배열을 뒤집은 다음 특정 순서가 필요할 때 명시 적으로 신뢰할 수없는 "For Each"루프를 사용하여 걷는 작업이 계속 진행됩니다. 죄송합니다 ... – SqlRyan

+3

모든 foreach'able 유형은 GetEnumerator()를 구현합니다. 일부 열거자는 안정적인 순서가 있고 일부는 신뢰할 수 없습니다. 우리가 역 순서에 대해 이야기하고 있기 때문에, 우리가 다루고있는 열거 자 (Enumerator)는 신뢰할 수있는 순서를 뒤집을 확률이 있습니다. 물론 모든 열거자가이 기준을 충족시키는 것은 아닙니다. 배열 용 열거 자 (Enumerators for Arrays)는 확실하게 순서가 바뀌고 되돌릴 수 있습니다. –

1

기본 설계 기능으로 For Each는 마지막 요소가 없거나 마지막 요소가 아직 알려지지 않은 열거 형을 반복 할 수 있습니다.

0

당신이해야 할 일은 이전에 가지고 있던대로 배열을 만들고 나서 array.reverse를 사용하고 배열에 대해 for each를 실행하는 것입니다. (객체, 0) 대신의 .Add 및 역방향 열거와 같은 결과를 당신이 .InsertAt을 할 수있는 루프 내부에 무슨에 따라

건배

+2

안녕 xxxmandoxxx. 답변을 추가하기 전에 동일한 답변이 이미 있는지 확인해야합니다. 귀하의 대답은 게시물에 가치를 부여하지 않습니다. – stenci

0

을 완료.

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

Testig는 프레임 워크 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: Reserve

+0

일반 목록에서도 작업 중입니다. – Dave

0

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

(210)
<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 
0

과 같이 호출을 한 후 .. 단계 -1 ..next 또 다른 정상을 만들 것 성명서. 예를 들어 참조 :

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 

을 나는 당신이 할 수있는 그

0

허용 된 대답은 이유를 설명 도움이 될 수 있지만, 키 (등 SortedList, SortedDictionary, 사전,)와 수집을 위해, 또 다른 예를 추가 할 수 있도록 노력하겠습니다

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

는 '무엇이든의 목록을 생성하고 수집 루프를 들어 단계별

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 

ToolStripItem을하고