C#关联数组

我一直在使用Hashtable,但本质上,哈希表没有订购,我需要在添加它们时保持一切顺序(因为我想以相同的顺序将它们拉出来)。 例如,如果我这样做:

pages["date"] = new FreeDateControl("Date:", false, true, false); pages["plaintiff"] = new FreeTextboxControl("Primary Plaintiff:", true, true, false); pages["loaned"] = new FreeTextboxControl("Amount Loaned:", true, true, false); pages["witness"] = new FreeTextboxControl("EKFG Witness:", true, true, false); 

当我做一个foreach时,我希望能够按以下顺序得到它:

 pages["date"] pages["plaintiff"] pages["loaned"] pages["witness"] 

我怎样才能做到这一点?

我相信.NET有OrderedDictionary类来处理这个问题。 它不是通用的,但它可以作为一个体面的Hashtable替代品 – 如果你不关心严格的类型安全。

我已经写了一个关于这个类的通用包装器,我愿意分享。

http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx

编辑:LBushkin是正确的 – OrderedDictionary看起来像它的伎俩,虽然是非通用的方式。 有趣的是,有多少专门的collections品没有通用的等价物:((对于Malfist来说,改变LBushkin的接受答案是有意义的。)

(我认为……).NET没有内置任何function。

基本上你需要保持List以及Dictionary 。 添加到字典时,将密钥添加到列表中。 然后,您可以遍历列表并按插入顺序查找键。 但是,当您移除或更换物品时,您需要小心。

.NET 4.0之前没有完美的解决方案。 在<3.5你可以:

使用具有整数键类型的通用SortedList ,以及项目派生最常见类型的值类型。 定义一个整数值(i,比方说),当你将每个项目添加到SortedList时,按下i ++键,随时增加它的值。 稍后,迭代排序列表的GetValueList属性。 此IList属性将按照您放入的顺序生成对象,因为它们将按您使用的键排序。

这不是快速,但非常好,通用。 如果您还想通过密钥访问,则需要执行其他操作,但我不会在您的要求中看到这一点。 如果您不是按键检索新的,并且按键顺序添加项目,那么集合实际上不必进行排序,就是这样。

.NET 4.0中,您将拥有通用的SortedSet Of T ,这对您来说绝对是完美的。 没有权衡。

使用排序列表我认为它将解决您的问题,因为SortedList对象内部维护两个数组来存储列表的元素; 也就是说,键的一个数组和关联值的另一个数组。 每个元素都是一个键/值对,可以作为DictionaryEntry对象进行访问

SortedList sl = new SortedList();

foreach(DictionaryEntry x in sl){}

使用KeyedCollection

它的底层基础是List,但提供了基于key的字典查找。 在这种情况下,您的密钥是字符串。 所以只要你没有两次添加相同的密钥就可以了。

http://msdn.microsoft.com/en-us/library/ms132438.aspx

正如Haxelit建议的那样,你可能来自KeyedCollection 。 它实际上使用了下面的List,直到你达到某个阈值,然后它同时保持List和Dictionary。 如果您可以使用某个函数从某个值中派生出一个键,那么这是一个简单的解决方案。 如果没有,那就太乱了。

最好的方法是使用C#索引器。 它可以配置为我们喜欢的任何东西。 我们可以传递intenumlongdouble或任何我们喜欢的东西。

只需要创建一个类并为其提供索引器并配置输入和输出参数。 这是一个更多的工作,但我认为这是唯一正确的方法。

有关如何使用它的更多信息,请参阅此MSDN链接 。

请参阅索引器: http : //msdn.microsoft.com/en-us/library/6x16t2tx.aspx

另一种方法是将您的有序键值保存在一个有序的结构中,如List,其余的仍然存储在一个字典中。

然后,当您需要访问数据时,只需浏览已排序的列表并在整个过程中查询您的词典。

查看排序列表http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx