有可能做一个For ...每个循环倒退吗?

And*_*ers 34 vb.net for-loop

我不相信传统方法可以做到这一点,但是像这个冗长的代码:

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从最后开始并向后工作的循环会更有效.

  • 感谢Jon,总是很高兴得到您的意见和建议:D (3认同)

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的概念,因为订单无论如何都没有定义.

祝好运!

  • 如果您知道正在使用的集合以正确的顺序迭代,那么*可以依赖它.例如,数组将*始终以自然顺序迭代.有关详细信息,请参阅我的回答 (6认同)
  • (被称为"订单未定义"的说法是错误的 - 它是由集合本身定义的.) (4认同)
  • Mike链接的MSDN页面确认了Jon Skeet所说的内容[否则不敢这样做] - "遍历的顺序不是由Visual Basic决定的,而是由枚举器对象的MoveNext方法确定的".所以order*是*定义的,但是由迭代的集合而不是For Each语句本身. (3认同)
  • 坦率地说,我认为这个答案是不正确的. (3认同)

Amy*_*y B 12

调用System.Linq.Enumerable.Reverse方法以获得与IEnuemrable(Of TSource)可枚举源相反的顺序.

  • 所有foreach'able类型都实现了GetEnumerator().一些普查员有可靠的订购,有些则没有.由于我们正在讨论逆序,我们正在处理的枚举器具有可靠的逆序排序.当然,并非所有的普查员都符合这一标准.大多数情况下,阵列的枚举器可靠地排序和可逆. (3认同)
  • 答案不应该只是链接. (2认同)

Dav*_*ave 5

在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:保留