使用列表中最后一个元素的“For Each”语句到第一个元素

时间:2013-09-26 12:01:05

标签: vb.net for-loop foreach

当我想从列表中的最后一个元素迭代到第一个元素时,我通常会这样做:

For i=list.Count-1 to 0 Step -1
    'do something
Next

我想知道是否有办法使用For Each语句以这种方式迭代列表。

谢谢!

3 个答案:

答案 0 :(得分:11)

可以使用Enumerable.Reverse完成此操作。如果list被输入IEnumerable,您可以这样称呼它:

For Each item in list.Reverse()
Next

但是,如果是ArrayListList(Of T),则会调用修改列表的Reverse方法(并且不会返回任何内容)。在这种情况下,您可以直接从Enumerable拨打电话或使用AsEnumerable

For Each item in Enumerable.Reverse(list)
Next

For Each item in list.AsEnumerable().Reverse()
Next

需要注意的是,此方法会将列表复制到数组中。如果您需要节省内存,最好使用For...To方法。您可以将其包装到您自己的iterator函数extension method中:

<Extension()>
Public Iterator Function LazyReverse(Of T)(source As IList(Of T)) As IEnumerable(Of T)
    For i = source.Count - 1 To 0 Step -1
        Yield source.Item(i)
    Next
End Function

然后随时打电话:

For Each item in list.LazyReverse()
Next

答案 1 :(得分:2)

如果你不介意它创造的开销,你可以使用反向:

list.reverse()
for each listElement in list
' ...
next

答案 2 :(得分:2)

如果您的列表是List(Of T)对象,则可以使用它的Reverse方法,例如:

list.Reverse()
For Each i In list
    'do something
Next

但是,这将改变列表中项目的实际顺序。如果您希望以相反的顺序获取项目而不影响原始列表中的顺序,则可以使用LINQ中提供的Reverse扩展方法,例如:

For Each i In list.As Enumerable().Reverse()
    'do something
Next

然而,最有效的方法是使用Step -1,但它确实意味着更多的输入......