它不可用,因为它是IEnumerator
仅向前的迭代器。它只有一个MoveNext()
方法。这使得界面非常通用,是 Linq 的核心。有很多真实世界的集合不能向后迭代,因为这需要存储。例如,大多数流都是这样的。
Linq 提供了一个带有Reverse()
扩展方法的解决方案。它首先存储元素,然后向后迭代它们。然而,这可能非常浪费,它需要 O(n) 存储。它缺少对已经可索引的集合的可能优化。您可以修复:
static class Extensions {
public static IEnumerable<T> ReverseEx<T>(this IEnumerable<T> coll) {
var quick = coll as IList<T>;
if (quick == null) {
foreach (T item in coll.Reverse()) yield return item;
}
else {
for (int ix = quick.Count - 1; ix >= 0; --ix) {
yield return quick[ix];
}
}
}
}
示例用法:
var list = new List<int> { 0, 1, 2, 3 };
foreach (var item in list.ReverseEx()) {
Console.WriteLine(item);
}
您需要对 LinkedList 进行专门化,因为它没有实现但仍允许通过and属性IList<T>
进行快速向后迭代。尽管不使用该类要好得多,但它的 CPU 缓存局部性很差。当您不需要便宜的刀片时,请始终青睐。它可能看起来像这样:Last
LinkedListNode.Previous
List<T>
public static IEnumerable<T> ReverseEx<T>(this LinkedList<T> list) {
var node = list.Last;
while (node != null) {
yield return node.Value;
node = node.Previous;
}
}