Да, определенно, хотя вам будет очень трудно найти документацию, которая разъясняет это точно .
Хотя документация для каждой из четырех GetEnumerator
перегрузок этого типа делает смутные заявления о возвращении «перечислителя, который перебирает коллекцию», вполне очевидно, что они должны создавать эквивалентные (отсортированные по ключу) последовательности; помните, что сортированный словарь предназначен для «представления набора пар ключ / значение, отсортированных по ключу». Было бы весьма не интуитивно понятным и запутанным для пользователей, если бы коллекция вела себя совершенно иначе (т.е. с другим порядком перечисления) между циклом foreach
и запросом LINQ to Objects, например.
Лучшее, что я могу сделать, - предоставить вам реализации двух GetEnumerator
методов, которые вам интересны (начиная с .NET 4.0). Они идентичны - они возвращают экземпляр вложенного типа Enumerator
, с такими же аргументами для его конструктора. Единственное отличие - бокс типа struct во второй перегрузке:
// 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<,>
экземпляров. Конечно, порядок перечисления будет таким же, как и для других перегрузок.