Кто-нибудь знает, была ли конкретная причина или дизайнерское решение не включать обратный перечислитель в C #? Было бы так хорошо, если бы существовал эквивалент C ++ reverse_iterator
, точно так же, как Enumerator является эквивалентом C ++ iterator
. Коллекции, которые могут быть подвергнуты обратной итерации, просто реализуют что-то вроде IReverseEnumerable, и можно делать что-то вроде:
List<int>.ReverseEnumerator ritr = collection.GetReverseEnumerator();
while(rtir.MoveNext())
{
// do stuff
}
Таким образом, вы сможете перебирать списки и связанные списки таким же образом, вместо того, чтобы использовать индексатор для одной и предыдущие ссылки для другой, тем самым достигая лучшей абстракции.
MoveNext()
мог бы показаться оксюмороном для обратного перечислителя, хотя я предполагаю, что для совместимости сforeach
методGetReverseEnumerator()
все равно должен будет возвращатьIEnumerator
и, следовательно, потребует этого метода, даже еслиMovePrevious()
будет казаться мне более подходящим - person RobV   schedule 18.02.2012IList<T>
, мы получаем эффективныйReverse
от linq. К сожалению, не каждый тип, который может эффективно реализоватьReverse
, может также реализоватьIList<T>
. Например, двусвязный список. Так что я согласен, что эти коллекции, имеющие встроенный методReverse()
, были бы хороши. - person CodesInChaos   schedule 18.02.2012foreachreverse
- person Rado   schedule 18.02.2012Enumerable.Reverse()
создает копию всей последовательности, даже дляIList<T>
. См. Джон Блог Скита. - person svick   schedule 18.02.2012