Joa*_*nge 7 .net c# ienumerable base-class-library
基本上我想知道为什么MS决定实现一个只支持前进的枚举器:MoveNext().
MovePrevious在整个.NET框架中强制执行这个广泛使用的界面是不是更灵活?
我可以想象它使Linq.ReverseMS更容易实现并且性能更高效,但我不确定这是否会使其他事情变得更慢或者在其他任何事情上都会产生巨大的开销.
任何对此主题有更多了解的人都可以提供更多信息吗?即,优点和具有或不具有的缺点MovePrevious在IEnumerable/IEnumerable<T>.
Mar*_*ell 21
IEnumerable[<T>]表示数据序列,而不是随机访问列表.并非所有序列都可以反转,甚至重放.基于网络流,数据库访问等的序列 - 或者这个美:
IEnumerable<int> GetData() {
Random rand = new Random();
while(true) { yield return rand.Next(); }
}
Run Code Online (Sandbox Code Playgroud)
您可以做的最好的事情是重新开始 - 不是通过调用Reset()(已弃用),而是通过获取新的枚举器.
即使没有Random它,也很容易想出无法逆转的简单序列(没有缓冲和反转缓冲区).根据您的需要,考虑一下IList[<T>]- 您可以通过索引器以任何顺序访问数据.
存在许多类型的数据,其中具有MovePrevious是没有意义的.例如,如果您从网络连接接收数据,则提供MovePrevious将需要缓冲整个流,以防您调用该方法.这会浪费大量内存.
话虽如此,拥有一个支持MoveNext和MovePrevious 的不同类型可能是有用的(例如,双向链表可以支持这一点).