Можно ли сделать For ... Каждая петля в обратном направлении? - PullRequest
34 голосов
/ 04 июня 2009

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

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

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

Ответы [ 13 ]

43 голосов
/ 04 июня 2009

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

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

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

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

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

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

37 голосов
/ 04 июня 2009

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

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

13 голосов
/ 04 июня 2009

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

Удачи!

12 голосов
/ 04 июня 2009

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

3 голосов
/ 08 апреля 2015

Тестиг в 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: Резерв

3 голосов
/ 13 января 2015
For Each s As String In myStringList.Reverse
    //' Do stuff here
Next
1 голос
/ 04 июня 2009

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

0 голосов
/ 02 июня 2017

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

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

0 голосов
/ 21 апреля 2017

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

For Each Id as Tkey in MyCollection.Keys.Reverse
   // The item in question is now available as MyCollection(Id)
Next
0 голосов
/ 14 апреля 2016

сначала вы должны создать список (из строки) для каждого оператора, а затем сделать еще один нормальный для оператора .. step -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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...