Подтвердить что ты не робот

Можно ли сделать для... Каждый цикл назад?

Я не считаю, что это возможно с помощью обычных методов, но что-то вроде этого подробного кода:

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

Мне, вероятно, придется инвертировать объект myString до обычного цикла For..Each Loop, правильно?

4b9b3361

Ответ 1

Я думаю, что документация, на которую ссылается ответ, крайне вводит в заблуждение. Порядок For Each определяется набором, который он назвал (т.е. Его реализация IEnumerable/IEnumerable<T>), но это не то же самое, что сказать, что его нельзя использовать, когда порядок важен. Многие коллекции (например, массивы, List<T> и т.д.) Всегда идут в "естественном" порядке.

Часть документации ссылается на это:

Порядок обхода. Когда вы выполняете Для каждого... Следующий цикл, обход сбор находится под контролем объект перечислителя, возвращаемый Метод GetEnumerator. Получатель чего-то обход не определяется визуальным Основной, но скорее MoveNext метод объекта перечислителя. Эта означает, что вы не сможете предсказать, какой элемент сбор первым будет возвращен в элементе или который является следующим возвращенный после заданного элемента.

Это вовсе не означает, что на него нельзя положиться - на него можно положиться, если вы знаете, что сбор, который вы повторяете, приведет к результатам в желаемом порядке. Не похоже, что он будет выбирать элементы наугад. Поведение в терминах IEnumerable/IEnumerable<T> четко определено на этой странице.

Важнейшими исключениями для предсказуемых упорядочений являются словари и наборы, которые естественно неупорядочены.

Чтобы отменить IEnumerable<T>, используйте Enumerable.Reverse - но если вам нужно итератировать в обратном порядке по коллекции, которая индексируется положением (например, массив или List<T>), было бы более эффективно использовать цикл For, начинающийся с конца и работающий назад.

Ответ 2

Вам нужно будет сделать что-то вроде:

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... Every" назад, хотя это было бы неплохо в нескольких случаях.

Ответ 3

К сожалению, MSDN документы на Для каждого состояния, что для каждой конструкции есть явно в тех случаях, когда порядок итерации не имеет значения ( неупорядоченные множества и т.п.). Таким образом, к сожалению, нет концепции обращения вспять a Для каждого, поскольку порядок не определен в любом случае.

Удачи!

Ответ 4

Вызвать System.Linq.Enumerable.Reverse метод, чтобы получить IEnuemrable(Of TSource) в обратном порядке вашего перечислимого источника.

Ответ 5

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

Ответ 6

Testig в Framework 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: Зарезервировать

Ответ 7

Причина, по которой это невозможно сделать, состоит в том, что в качестве базовой конструктивной функции For Every может выполнять итерацию по перечислимому без последнего элемента или с еще неизвестным последним элементом.

Ответ 8

Что вам нужно сделать, так это создать массив с вашим для каждого, который у вас был раньше, а затем использовать array.reverse и запустить для каждого из массива. Готово

Приветствия

Ответ 9

В зависимости от того, что происходит внутри вашего цикла, вы можете сделать .InsertAt(объект, 0) вместо .Add и получить тот же результат, что и обратное перечисление.

Ответ 10

Вы можете добавить расширенную функцию в класс, который вы пытаетесь отменить

<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

Ответ 11

сначала вы должны создать список (строки) для каждого оператора, а после этого сделать еще один нормальный для.. шаг -1..next statement. см. пример:

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

Надеюсь, что это будет полезно

Ответ 12

Принятый ответ объясняет, почему, но для добавления другого примера для коллекции с ключом (SortedList, SortedDictionary, Dictionary и т.д.) вы можете сделать

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

Ответ 13

'создайте список всех и сделайте шаг для сбора петли

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.DropDownItems тем, что вам нужно