当我在.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/

10-16 09:01