Во-первых, исходя из вашего основного предположения, вы правы. Обычный словарь не дает никаких гарантий относительно порядка перечисления.
Во-вторых, вам нужно быть осторожным при переходе по SortedDictionary
с пользовательским маршрутом IComparer
. Компаратор используется для равенства ключей, а также для сортировки коллекции. То есть, используя IComparer
на основе порядка добавления, вы можете столкнуться с трудностями при извлечении элемента из SortedDictionary
по значению ключа, он может в конечном итоге потеряться в дереве (которое является основой отсортированного словаря).
Если вы хотите пойти по пути C5 Generic Class Library, вы можете получить неплохой пробег из HashedLinkedList<KeyValuePair<T>>
или HashedLinkedList<T>
, если T самозабирается. Вы можете создать IEqualityComparer
, который будет работать с ключом для генерации хеш-кода. Затем, извлекая фактическое значение, вы можете использовать Find(ref T x)
с прототипом x (возможно, там, где установлен только ключ), который найдет сохраненный T
и вернет его по ссылке за O (1) раз против O ( log n ) с SortedDictionary
. Кроме того, будучи поддержанным LinkedList
, он гарантированно перечисляет в порядке добавления (и вы можете указать, какое направление вы бы предпочли через C5 IDirectedEnumerable
).
Надеюсь, это поможет.