我不相信传统方法可以做到这一点,但是像这个冗长的代码:
For Each s As String In myStringList Step -1
//' Do stuff here
Next
Run Code Online (Sandbox Code Playgroud)
我可能不得不在传统的For..Each循环之前反转myString对象,对吗?
Jon*_*eet 45
我认为答案中引用的文档极具误导性.顺序For Each
这就是所谓的(即它的实现是通过收集定义IEnumerable
/ IEnumerable<T>
),但是这不等于说它不应该被使用时的顺序是非常重要的.许多集合(例如数组List<T>
等)总是以"自然"顺序进行.
部分文档确实提到了这一点:
遍历令.当您执行For Each ... Next循环时,集合的遍历受GetEnumerator方法返回的枚举器对象的控制.遍历的顺序不是由Visual Basic确定的,而是由枚举器对象的MoveNext方法确定的.这意味着您可能无法预测集合中哪个元素首先在元素中返回,或者哪个元素是在给定元素之后返回的元素.
这并不是说它不能依赖它 - 如果你知道你正在迭代的集合将以所需的顺序产生结果,那么它可以依赖它.它不像是随意挑选元素.在该页面上明确定义IEnumerable
/ 的行为IEnumerable<T>
.
可预测排序的最重要的例外是字典和集合,它们自然是无序的.
要反转IEnumerable<T>
,请使用Enumerable.Reverse
- 但是如果您需要在按位置索引的集合(例如数组或List<T>
)上反向迭代,那么使用For
从最后开始并向后工作的循环会更有效.
Sql*_*yan 38
你必须做的事情如下:
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
Run Code Online (Sandbox Code Playgroud)
但据我所知,你不能做一个"For ... Each"倒退,虽然在一些情况下会很好.
Mik*_*ike 13
遗憾的是,MSDN上的For Each状态说明For Each构造明确存在迭代顺序不重要的情况(无序集等).因此,遗憾的是没有倒转For Each的概念,因为订单无论如何都没有定义.
祝好运!
Amy*_*y B 12
调用System.Linq.Enumerable.Reverse
方法以获得与IEnuemrable(Of TSource)
可枚举源相反的顺序.
在Framework 4中测试,代码
For Each s As String In myStringList.Reverse
//' Do stuff here
Next
Run Code Online (Sandbox Code Playgroud)
它不起作用,正确的方法是:
myStringList.Reverse() ' it is a method not a function
For Each s As String In myStringList
//' Do stuff here
Next
Run Code Online (Sandbox Code Playgroud)
查看:MSDN:保留