在.NET中是否有一个集合可以存储KeyValuePair<string, string>并保持插入顺序?OrderedDictionary看起来很有前途,但似乎相当缺乏。现在我正在研究IOrderedEnumerable>,但是除了ISortedDictionary之外,我似乎找不到任何实现,但那不是我想要的。不需要进行排序,只需重要的是插入的顺序。
更新:我不喜欢OrderedDictionary的原因是它不是泛型的。
更新:我不喜欢OrderedDictionary的原因是它不是泛型的。
只需使用 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){
...}
SortedList<TKey, TValue>
或SortedDictionary<TKey, TValue>
。如果您想知道应该使用哪个,请参考MSDN,它提供了一些选择一个而不是另一个的好理由。OrderedDictionary
是一种同时支持按键和插入顺序访问项的数据结构,它实际上就是哈希表和列表的组合。它提供了一种通过插入索引或关键字来访问其中项的方法。这是.NET中唯一具备这种特性的集合。不过遗憾的是,它不是泛型的。
如果仅仅因为不是泛型的而OrderedDictionary
不能满足您的需求,那么可以使用此处提供的泛型版本。如果还有其他原因导致它无法满足您的需求,请更新您的帖子,我们可以寻找更好的选择。
虽然您确实可以创建自己的List<KeyValuePair<string,string>>
,但您将失去有效地按键搜索的选项。现在,您当然可以自己实现一个组合了列表和字典的有序字典,但我已经在链接的帖子中提供了这样的实现。
OrderedDictionary.Remove
具有O(N)复杂度,因为每次删除一个条目时,所有在它上方的条目都会下移。因此,这个集合并不能在所有方面都复制字典的性能特征。 - Theodor ZouliasQueue<T>
,其中 T 是 KeyValuePair<string, string>
,以确保插入顺序的更稳定的契约。
Queue<T>
不支持从集合中删除特定元素。你只能出队列头的元素。因此,它不能作为完全功能字典的基础。 - Theodor ZouliasList<KeyValuePair<string,string>>
。我在 MSDN 文档中并没有找到保证插入顺序的说明,但这是一个相当安全的选择...
OrderedDictionary
是你正在寻找的内容,但不幸的是它不是通用的。除此之外,还有什么其他的东西是你所需要的吗?如果你能澄清你所需要的内容(以及为什么内置类不能满足你的需求),你将会得到更好的答案。 - LBushkin