5

我被引导相信我不能指望添加到字典中的项目的顺序来进行枚举。

是否有一个类(如果可能的话是通用的),可以使用键向其中添加项目并且可以按附加顺序枚举或可以通过键检索哪些项目?

澄清:我不想在 Key Order 中列举。我想按顺序列举。也就是说,我希望能够在 FIFO(先进先出)的基础上通过枚举来检索项目。

4

4 回答 4

4

您只需使用List按添加顺序存储键的 a 即可达到您想要的效果。然后您可以按顺序枚举该列表,并从Dictionary.

但是,如果您想使用一个现有的集合类型来完成所有这些操作,我不知道有一种类型可以在不需要提供比较器或没有键作为项目一部分的情况下执行此操作。对于前者,您可以尝试SortedDictionary,对于后者,您可以从中派生一个新集合KeyedCollection(不完全确定这是否会在没有比较器的情况下保持顺序,因此您需要进行实验以确认这一点)。

于 2008-10-21T17:15:15.953 回答
3

首先,根据您的主要假设,您是正确的。普通字典不保证枚举的顺序。

其次,您需要小心SortedDictionary使用自定义IComparer路线。比较器用于键相等以及对集合进行排序。也就是说,使用IComparer基于添加顺序的 an,您可能难以SortedDictionary通过键值从 a 中检索元素,它最终可能会丢失在树中(这是排序字典的支持)。

如果您愿意走 C5 通用类库路线,则可以从 aHashedLinkedList<KeyValuePair<T>>HashedLinkedList<T>T 是自键控的情况下获得一些不错的成绩。您可以创建一个IEqualityComparer将对密钥进行操作以生成哈希码的方法。然后检索实际值,您可以使用Find(ref T x)原型 x (可能只设置键),它将找到存储的并通过在O (1) 时间与O ( log nT )中的引用返回它a 。同样,由 a 支持,它保证按附加顺序枚举(并且您可以通过 C5 指定您喜欢的方向)。SortedDictionaryLinkedListIDirectedEnumerable

希望有帮助。

于 2008-10-21T17:37:05.427 回答
0

您可以创建自己的泛型类(并使其派生自 Dictionary<,> 或 SortedDictionary<,>)并实现您自己的 GetEnumerator() 版本,您可以在其中按键对字典进行排序并返回排序后的值(或者如果您使用 SortedDictionary 然后它已经排序)。

您也可以使用 SortedList<,>,它在某些情况下更好更轻,请查看 MSDN 以了解最符合您的需求。

于 2008-10-21T17:31:16.220 回答
0

主题现在有点老了,但我一直在寻找具有相同行为的集合(保留添加项目的顺序)并且能够在键上索引集合。答案是抽象类 KeyedCollection<>!(在 System.Collections.ObjectModel 命名空间中)我用字典和这个 keyedcollection 运行了一个简单的测试,通过添加一堆时间,从中间删除一个并再次添加项目。KeyedCollection 将新项目添加到末尾,字典将其放置在其原始位置(我猜那里正在进行某种散列)

于 2009-10-07T15:52:09.387 回答