C#关联数组

时间:2009-12-16 15:26:11

标签: c# .net collections

我一直在使用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"] 

我该怎么做?

10 个答案:

答案 0 :(得分:21)

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

我已经在这个类中编写了一个通用的包装器,我愿意与之分享。

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

答案 1 :(得分:12)

编辑:LBushkin是对的 - OrderedDictionary看起来像是诀窍,虽然是非通用的方式。有趣的是,有多少专门的收藏品没有通用的等价物:((对于Malfist来说,改变LBushkin的接受答案是有意义的。)

(我以为......).NET没有任何内置功能。<​​/ p>

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

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

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

SortedList sl = new SortedList();

foreach(DictionaryEntry x in sl) {}

答案 4 :(得分:0)

使用KeyedCollection

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

答案 8 :(得分:0)

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

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

答案 9 :(得分:-1)