Как вы можете выполнить обратный ход через коллекцию С#?

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

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

Ответ 1

Вы можете использовать обычный цикл 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, вероятно, будет немного быстрее.

Ответ 2

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

foreach(var item in collection.Reverse()) { ... }

Ответ 3

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

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

for(int i = list.Count -1; i >= 0; --i)
{
   x = list[i];
}

Ответ 4

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

using System.Linq;

foreach (var c in collection.Reverse()) {
}

Ответ 5

        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();           

Reactive Extension для .NET 3.5/4.0