改变Foreach命令?
无论如何都要通过列表从结尾到开头而不是从开始到结束(最好不重新排序列表)。
using System.Linq; foreach(var item in source.Reverse()) { ... }
编辑:如果您专门处理List
还有一个步骤。 该类定义了自己的Reverse
方法,其签名与Enumerable.Reverse
扩展方法不同。 在这种情况下,您需要将变量引用“提升”到IEnumerable
:
using System.Linq; foreach(var item in list.AsEnumerable().Reverse()) { ... }
你可以使用一个常规的for循环,从最后开始并减少,而不是从顶部开始并递增。
就像是:
for(int i=foo.lenth; i != 0; i--) { do stuff }
你可能不想做任何复杂的事情,所以我建议你只使用for循环。
但是,如果它是某种要求 ,您当然可以为自定义列表迭代行为实现自己的迭代器 。
这取决于你的意思是列表 。
-
List
? 不,除非你使用Linq和它的Reverse()函数。 - 你的定制系列? 很容易,就像你想要的那样实现IEnumerator。
为清楚起见,错误检查已省略。 使用IEnumerable和IEnumerator的自定义实现。 这将避免不必要的复制。
using System; using System.Collections.Generic; namespace ConsoleApplication3 { class ReversedEnumerator : IEnumerator { List v; int index; public ReversedEnumerator(List v) { this.v = v; this.index = v.Count; } public int Current { get { return v[index]; } } public void Dispose() { } object System.Collections.IEnumerator.Current { get { return v[index]; } } public bool MoveNext() { return --index >= 0; } public void Reset() { index = this.v.Count; } } class EnumeratorStub : IEnumerable { List v; public EnumeratorStub(List v) { this.v = v; } public IEnumerator GetEnumerator() { return new ReversedEnumerator(v); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return new ReversedEnumerator(v); } } class Program { static EnumeratorStub Reverse(List v) { return new EnumeratorStub(v); } static void Main(string[] args) { List v = new List (); v.Add(1); v.Add(2); v.Add(3); foreach (int item in Reverse(v)) { Console.WriteLine(item); } Console.ReadKey(); } } }
我建议重构代码示例以使用generics。 这样你可以将它用于任何容器类型。
不是c#,但你也可以这样做:-)
Dim a As New List(Of Integer) a.Add(1) a.Add(2) a.Add(3) For Each i In a.AsEnumerable.Reverse Debug.Print(i) Next
IList strList = new IList (); strList.Add("A"); strList.Add("B"); strList.Add("C"); for (int i = strList.Count-1; i>=0;i--) { Console.WriteLine(strList[i]); }
没试过,但应该工作。