2012-12-21 43 views
9

假设我有一个Dictionary,并按特定顺序添加每个keyvalue条目。
现在,如果我想稍后能够以相同的顺序迭代这个Dictionary条目被添加,是这个词典上简单的foreach循环得到的顺序?用foreach遍历字典,按什么顺序完成?

如果不是,我会很高兴听到我该怎么做,我知道这可以用List而不是Dictionary轻松完成,但我不想。

感谢

+4

不,字典不维护顺序。不幸的是,我认为你需要使用一个List。 – phoog

+0

使用'IEnumerable >'代替(例如,List <>) – sehe

+2

@seth Dictionary *是* IEnumerable >'。 – phoog

回答

15

正常Dictionary不保证项目的顺序。

如果您想维护添加到其中的订单商品,则需要OrderedDictionary。请注意,在.Net框架中没有该类的通用版本,因此要么放弃某种类型安全性或找到其他实现(即https://www.codeproject.com/Articles/18615/OrderedDictionary-T-A-generic-implementation-of-IOsuggested by Tim S)。

或者,如果O(log n)查找正常并且键应该排序 - SortedDictionary

+2

请注意,这个类不使用泛型,所以它不是类型安全的。如果你想让你的集合使用泛型(我推荐它),请使用类似'OrderedDictionary'的实现:http://www.codeproject.com/Articles/18615/OrderedDictionary-TA-generic-implementation-的-IO –

2

Dictionary s为哈希表,这意味着你不能保证迭代对将在您添加它们的相同顺序返回它们。

每一对都是KeyValuePair<T_K, T_V>,所以你可以有一个List<KeyValuePair<string, string>>,如果这是你需要的,你可以按照你添加它们的顺序迭代。

+0

您能否介绍一下更多关于'List >'的内容,猜你不是故意要列出字典吗? – JavaSa

+1

@JavaSa当你枚举'Dictionary'时,你得到了一个'KeyValuePair '的枚举,所以我只是使用一个列表。 Alexei Levenkov的回答绝对是比较正确的,虽然 – climbage

2

字典的内部排序取决于使用的散列函数。但是,如果您需要数据的排序视图,则可以使用Enumerable.OrderBy