当我在.NET中有SortedDictionary<TK, TV>
时,我想对其进行枚举,因为ICollection<KeyValuePair<TK, TV>>
会按预期顺序枚举吗?
那是返回键值最低的KeyValuePair<TK, TV>
的第一个,然后返回键值第二个最低的KeyValuePair<TK, TV>
的?
注意:仅接受通过引用备份的答案。
最佳答案
是的,当然可以,尽管您将很难找到精确地阐明这一点的文档。
尽管有关此类型的四个GetEnumerator
重载中的每一个的文档都对返回“遍历集合的枚举数”做出模糊的声明,但显然它们应该产生等效的(按键排序)序列;这很明显。请记住,排序字典的意思是“表示按键排序的键/值对的集合”。例如,如果一个集合的行为在foreach
循环和LINQ to Objects查询之间完全不同(即具有不同的枚举顺序),这将对用户造成极大的直觉和困惑。
我能做的最好的就是为您提供您似乎感兴趣的两种GetEnumerator
方法的实现(从.NET 4.0开始)。它们是相同的-它们返回嵌套Enumerator
类型的实例,并为其构造函数使用相同的参数。唯一的区别是第二个重载中的struct-type装箱:
// Used when you do foreach(var kvp in dict) { ... }
public Enumerator<TKey, TValue> GetEnumerator()
{
return new Enumerator<TKey, TValue>
((SortedDictionary<TKey, TValue>) this, 1);
}
// Used when you do:
// foreach(var kvp in (ICollection<KeyValuePair<TKey, TValue>>)dict) { ... }
// or use LINQ to Objects on the collection.
IEnumerator<KeyValuePair<TKey, TValue>>
IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator()
{
return new Enumerator<TKey, TValue>
((SortedDictionary<TKey, TValue>) this, 1);
}
实际上,唯一实现方式略有不同的
GetEnumerator
重载是IDictionary.GetEnumerator
方法。这将更改构造函数调用的参数,以使结果枚举器生成DictionaryEntry
实例,而不是KeyValuePair<,>
实例。当然,枚举顺序将与其他重载相同。关于c# - 枚举SortedDictionary时,是否按预期顺序返回KeyValuePairs?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5765242/