Можно ли сделать для... Каждый цикл назад?
Я не считаю, что это возможно с помощью обычных методов, но что-то вроде этого подробного кода:
For Each s As String In myStringList Step -1
//' Do stuff here
Next
Мне, вероятно, придется инвертировать объект myString до обычного цикла For..Each Loop, правильно?
Ответы
Ответ 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 тем, что вам нужно