有序的Keyvaluepairs列表?

时间:2010-06-18 14:52:05

标签: c# .net collections

.net中是否有一个集合允许存储KeyValuePair<string, string>以保持插入顺序?
OrderedDictionary看起来很有前途,但似乎相当缺乏 现在我正在研究IOrderedEnumerable&gt;,但我似乎找不到除了ISortedDictionary之外的任何实现,但这不是我想要的。不需要进行排序,只需插入顺序很重要。

更新
我不喜欢OrderedDictionary的原因是它不是通用的。

5 个答案:

答案 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>。这是一个更明确的合同,明确保证了插入顺序。

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

答案 4 :(得分:0)

您应该只能使用List<KeyValuePair<string,string>>。我实际上无法在MSDN文档中找到说明插入顺序是有保证的,但这是一个非常安全的选择......