如何通过C#集合反转遍历?

Sam*_*m F 11 c# collections reverse traversal

是否有可能以foreach相反的顺序遍历Collections对象的语句?

如果不是foreach声明,还有另一种方式吗?

SLa*_*aks 20

您可以for向后使用正常循环,如下所示:

for (int i = collection.Count - 1; i >= 0 ; i--) {
    var current = collection[i];
    //Do things
}
Run Code Online (Sandbox Code Playgroud)

你也可以使用LINQ:

foreach(var current in collection.Reverse()) {
    //Do things
}
Run Code Online (Sandbox Code Playgroud)

但是,正常for循环可能会快一点.

  • @Sam F.不,你不是!:-) (6认同)
  • @Ed:在这个迭代器和LINQ的时代,for循环似乎是彻头彻尾的过时. (4认同)
  • `for`循环可能更快,但LINQ肯定更清晰.因此我更喜欢LINQ版本. (2认同)
  • @jball:在for循环中向后迭代在某种程度上"不清楚"?真? (2认同)
  • 那个用户名是天才.我喜欢这样一个事实:每个人都会称你为"嘿,白痴" (2认同)
  • @SLaks:读回来我意识到我听起来有点蠢; 这不是我的意图.我只是想指出最好使用`Reverse`作为一般情况,因为不是每个集合都有一个索引器. (2认同)

48k*_*ocs 7

你可以在集合上调用Reverse().

foreach(var item in collection.Reverse()) { ... }
Run Code Online (Sandbox Code Playgroud)

  • @Sam F:它是任何`IEnumerable <T>`(包括`Collection <T>`)的[扩展方法](http://msdn.microsoft.com/en-us/library/bb383977.aspx),从.NET 3.5开始提供.请参阅[此处](http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods.aspx)以获取所有这些列表.如果您使用的是.NET 3.5或更高版本,则只需将`using System.Linq;`添加到文件的顶部即可. (2认同)
  • 我想我应该添加一个注释 - 令人困惑的是,Reverse()对IList <T>的含义与对标准IEnumerable <T>的含义不同.IList <T> .Reverse()返回void,所以为了让我的代码段工作,你必须说集合.AsEnumerable().Reverse().令人困惑的是,那. (2认同)

tay*_*onr 5

如果您使用的是 3.5,看起来 LINQ 中有一个 Reverse() 方法,它不会以相反的顺序迭代,但会反转整个列表,那么您可以执行 foreach。

或者您可以使用简单的 for 语句:

for(int i = list.Count -1; i >= 0; --i)
{
   x = list[i];
}
Run Code Online (Sandbox Code Playgroud)

  • 您要求出现“IndexOutOfBounds”错误。从“i = count - 1”开始 (5认同)
  • “这不会以相反的顺序迭代,但会反转整个列表。” 这是不真实的。以相反顺序迭代“精确地”正是“Enumerable.Reverse&lt;T&gt;”扩展方法所做的事情。您可能会想到“List&lt;T&gt;.Reverse”,它[令人困惑地具有相同的名称](http://stackoverflow.com/questions/2828917/most-awkward-misleading-method-in-the-net-api /2829051#2829051)。 (2认同)