有序枚举

时间:2014-07-14 07:45:47

标签: c# containers enumeration

.NET标准库中提供的几个集合旨在保持内部项目的顺序 - 例如ListLinkedListQueueStack。另一方面,其他人则以其他方式排列项目,例如DictionaryHashSet

我的问题是:如果容器按特定顺序保存元素(按顺序),是否保证,那么通过此容器枚举最初将按此顺序完成?

例如,我想以相反的顺序枚举列表中的项目。简单的方法是写:

foreach (var item in list.Reverse<type>()) { ... }

但是只有当初始枚举器按照存储在其中的顺序遍历集合的项目时,这才有效。如果没有这样的保证,我应该以其他方式编写代码:

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

实际上更短,但肯定不太可读。

注意:我知道,该列表实际上按顺序枚举了项目并且直觉说,所有已订购的容器都将执行相同的操作。但是,如果框架无法保证,.NET 5.0可能会引入枚举(例如)更高效的方式,但会破坏项目的顺序。


MSDN docs 建议,通过使用“集合中的第一个元素之前”和“移动到集合中的下一个元素”之类的术语来保存顺序。但这足以说明,订单是保证

1 个答案:

答案 0 :(得分:1)

我认为任何人(甚至微软)都不能保证未来软件的行为方式。但是,您链接到的MSDN页面说,“例如,ArrayList的枚举器保留了在集合中输入元素的顺序。” List<T>是一个有序列表,我会说一个按顺序返回项目的枚举器已损坏。我想你可以安全地使用Reverse<T>。请记住,对列表的任何更改都将使您的枚举器无效。在枚举时,请确保您的列表不会被任何其他线程更改。