改变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]); } 

没试过,但应该工作。