Как вы можете вернуться через коллекцию C #? - PullRequest
11 голосов
/ 16 июня 2010

Возможно ли иметь оператор foreach, который будет проходить через объект Коллекции в обратном порядке?

Если не оператор foreach, есть ли другой способ?

Ответы [ 5 ]

20 голосов
/ 16 июня 2010

Вы можете использовать обычный цикл for в обратном направлении, например:

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

Вы также можете использовать LINQ:

foreach(var current in collection.Reverse()) {
    //Do things
}

Однако обычный цикл for, вероятно, будет немного быстрее.

7 голосов
/ 16 июня 2010

Вы можете просто вызвать Reverse () для коллекции.

foreach(var item in collection.Reverse()) { ... }
4 голосов
/ 16 июня 2010

В качестве альтернативы, если коллекция IEnumerable и, следовательно, не имеет произвольного доступа, используйте метод IEnumerable.Reverse () System.Linq и применяйте forearch как обычно.

using System.Linq;

foreach (var c in collection.Reverse()) {
}
4 голосов
/ 16 июня 2010

Если вы используете 3.5, похоже, что в LINQ есть метод Reverse () Это не будет повторять в обратном порядке, но полностью перевернет весь список, тогда вы можете выполнить свой foreach.

Или вы можете использовать простое выражение:

for(int i = list.Count -1; i >= 0; --i)
{
   x = list[i];
}
2 голосов
/ 17 июня 2010
        List<string> items = new List<string> 
        { 
            "item 1", 
            "item 2",
            "item 3", 
            "item 4", 
        };
        lines.AsEnumerable().Reverse()
                            .Do(a => Console.WriteLine(a), ex => Console.WriteLine(ex.Message), () => Console.WriteLine("Completed"))
                            .Run();           

Реактивное расширение для .NET 3.5 / 4.0

...