当我想从列表中的最后一个元素迭代到第一个元素时,我通常这样做:
For i=list.Count-1 to 0 Step -1
'do something
Next
我想知道是否有一种方法可以使用 For Each 语句以这种方式遍历列表。
谢谢!
这可以通过Enumerable.Reverse来完成。如果list
键入为IEnumerable
,您可以这样称呼它:
For Each item in list.Reverse()
Next
但是,如果它是ArrayList
or List(Of T)
,这将调用修改列表的Reverse方法(并且不返回任何内容)。在这种情况下,您可以Enumerable
直接调用或使用AsEnumerable:
For Each item in Enumerable.Reverse(list)
Next
For Each item in list.AsEnumerable().Reverse()
Next
需要注意的是,此方法会将列表复制到数组中。如果需要节省内存,最好使用该For...To
方法。不过,您可以将其包装到您自己的迭代器函数扩展方法中:
<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
如果您不介意它产生的开销,您可以使用 reverse :
list.reverse()
for each listElement in list
' ...
next
如果您的列表是一个List(Of T)
对象,您可以使用它的Reverse
方法,例如:
list.Reverse()
For Each i In list
'do something
Next
但是,这将改变列表中项目的实际顺序。如果你想在不影响原始列表中的顺序的情况下以相反的顺序获取项目,可以使用Reverse
LINQ 中提供的扩展方法,例如:
For Each i In list.As Enumerable().Reverse()
'do something
Next
然而,最有效的方法是使用Step -1
,尽管它确实意味着更多的打字......