我一直在使用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"]
我该怎么做?
答案 0 :(得分:21)
我相信.NET有OrderedDictionary
类来处理这个问题。它不是通用的,但它可以作为一个体面的Hashtable替代品 - 如果你不关心严格的类型安全。
我已经在这个类中编写了一个通用的包装器,我愿意与之分享。
http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx
答案 1 :(得分:12)
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的字典查找。在这种情况下,您的密钥是字符串。因此,只要您没有两次添加相同的密钥,就可以了。
答案 5 :(得分:0)
正如Haxelit建议的那样,你可能来自KeyedCollection<TKey, TValue>
。它实际上使用了下面的List,直到你达到某个阈值,然后它同时保持List和Dictionary。如果您可以使用函数从某个值中派生出一个键,那么这是一个简单的解决方案。如果没有,那就太乱了。
答案 6 :(得分:0)
最好的方法是使用C#索引器。它可以配置为我们喜欢的任何东西。我们可以传递int
,enum
,long
,double
或任何我们喜欢的内容。
只需要创建一个类并为其提供索引器并配置输入和输出参数。这是一个更多的工作,但我认为这是唯一正确的方法。
有关如何使用它的更多信息,请参阅此MSDN link。
答案 7 :(得分:0)
答案 8 :(得分:0)
另一种方法是将您的有序键值保存在一个有序的结构中,如List,其余的仍然存储在一个字典中。
然后,当您需要访问数据时,只需浏览已排序的列表并在整个过程中查询您的词典。
答案 9 :(得分:-1)