.NET标准库中提供的几个集合旨在保持内部项目的顺序 - 例如List
,LinkedList
,Queue
或Stack
。另一方面,其他人则以其他方式排列项目,例如Dictionary
或HashSet
。
我的问题是:如果容器按特定顺序保存元素(按顺序),是否保证,那么通过此容器枚举最初将按此顺序完成?
例如,我想以相反的顺序枚举列表中的项目。简单的方法是写:
foreach (var item in list.Reverse<type>()) { ... }
但是只有当初始枚举器按照存储在其中的顺序遍历集合的项目时,这才有效。如果没有这样的保证,我应该以其他方式编写代码:
for (int i = list.Count - 1; i >= 0; i--) { ... }
实际上更短,但肯定不太可读。
注意:我知道,该列表实际上按顺序枚举了项目并且直觉说,所有已订购的容器都将执行相同的操作。但是,如果框架无法保证,.NET 5.0可能会引入枚举(例如)更高效的方式,但会破坏项目的顺序。
MSDN docs 建议,通过使用“集合中的第一个元素之前”和“移动到集合中的下一个元素”之类的术语来保存顺序。但这足以说明,订单是保证?
答案 0 :(得分:1)
我认为任何人(甚至微软)都不能保证未来软件的行为方式。但是,您链接到的MSDN页面说,“例如,ArrayList的枚举器保留了在集合中输入元素的顺序。” List<T>
是一个有序列表,我会说一个按顺序返回项目的枚举器已损坏。我想你可以安全地使用Reverse<T>
。请记住,对列表的任何更改都将使您的枚举器无效。在枚举时,请确保您的列表不会被任何其他线程更改。