.net中是否有一个集合允许存储KeyValuePair<string, string>
以保持插入顺序?
OrderedDictionary看起来很有前途,但似乎相当缺乏
现在我正在研究IOrderedEnumerable&gt;,但我似乎找不到除了ISortedDictionary之外的任何实现,但这不是我想要的。不需要进行排序,只需插入顺序很重要。
更新
我不喜欢OrderedDictionary的原因是它不是通用的。
答案 0 :(得分:9)
OrderedDictionary
是您想要的,如果您需要键入和插入顺序访问项 ...它实际上只是哈希表和列表的组合。它提供了一种通过插入索引或按键访问其中项目的方法。它是.NET中唯一一个这样做的集合。可悲的是,它不是通用的。
如果OrderedDictionary
不能完全满足您的需求,因为它不是通用的 - 那么您可以使用the version here that provides a generic equivalent。如果还有其他原因导致它不适合您,请更新您的帖子,我们可以寻找更好的选择。
虽然您当然可以创建自己的List<KeyValuePair<string,string>>
,但您将无法有效地按键搜索。现在,你可以推出自己的有序文件的实现,将list / dict组合在一起......但我链接到的帖子已经这样做了。
答案 1 :(得分:8)
虽然我迟到了,但.NET Framework 4.5为您提供了新的课程。请参阅SortedList<TKey, TValue>
或SortedDictionary<TKey, TValue>
。如果您想知道应该使用哪一个,MSDN提供了一些很好的理由,您可以选择一个而不是另一个。
SortedList泛型类是一个带有O(log n)检索的键/值对数组,其中n是字典中元素的数量。在这里,它类似于SortedDictionary通用类。这两个类具有相似的对象模型,并且都具有O(log n)检索。两个类别的区别在于内存使用和插入和删除的速度:
SortedList<TKey, TValue>
使用的内存少于SortedDictionary<TKey, TValue>
。SortedDictionary<TKey, TValue>
对未排序数据的插入和删除操作更快,O(log n)而不是SortedList<TKey, TValue>
的O(n)。- 如果列表是从排序数据中一次性填充的,则
SortedList<TKey, TValue>
比SortedDictionary<TKey, TValue>
快。
SortedDictionary<TKey, TValue>
和SortedList<TKey, TValue>
类之间的另一个区别是SortedList<TKey, TValue>
支持通过Keys和Values属性返回的集合对键和值进行有效的索引检索。访问属性时没有必要重新生成列表,因为列表只是内部键和值数组的包装。
两个链接都有类似的备注部分(引用来自的地方)。他们还为这两个班级提供了更多信息。如果您有兴趣使用其中一个,我建议您阅读这两个部分。
答案 2 :(得分:7)
只需使用List<KeyValuePair<T,T>>
即可。它们按插入顺序存储。每次添加时,最新的一个都会添加到列表的末尾。
所以
var list = new List<KeyValuePair<String,String>>();
list.Add(new KeyValuePair<String,String>("",""));
如果你想将它们拉出来,只需使用:
list.ForEach(x=>...);
或
foreach(var item in list){
...}
答案 3 :(得分:3)
您可能希望使用Queue<T>
来滚动一个,其中T是KeyValuePair<string, string>
。这是一个更明确的合同,明确保证了插入顺序。
答案 4 :(得分:0)
您应该只能使用List<KeyValuePair<string,string>>
。我实际上无法在MSDN文档中找到说明插入顺序是有保证的,但这是一个非常安全的选择......