Как я могу использовать TEnumerator для прохождения моего TDictionary в отсортированном порядке по ключу?
У меня есть что-то вроде этого:
var
Dic: TDictionary<string, string>;
Enum: TPair<string, string>;
begin
Dic := TDictionary<string, string>.create;
Dic.Add('Tired', 'I have been working on this too long');
Dic.Add('Early', 'It is too early in the morning to be working on this');
Dic.Add('HelpMe', 'I need some help');
Dic.Add('Dumb', 'Yes I know this example is dumb');
{ I want to do the following but do it in sorted order by Enum.Key }
for Enum in Dic do
some processing with Enum.Key and Enum.Value;
Dic.Free;
end;
Поэтому я хотел бы обработать мой словарь в порядке: Dumb, Early, HelpMe, Tired.
К сожалению, помощь Delphi очень минимальна в описании того, как конкретно перечисляются генераторы и TEnumerator, и не дает никаких примеров, которые я могу найти. В Интернете также мало написано об использовании Enumerators с Generics в Delphi.
И мой пример кода выше даже не использует TEnumerator, поэтому я смущен тем, как все это предназначено для использования.
Спасибо, Барри, за ваш ответ.
Мое предприятие в Generics, так как я задал вопрос, было интересно. Я хотел начать внедрять их в свой код. Проблема "сортировки" была несколько озадачивающей, поскольку, похоже, у Generics есть методы, связанные с сортировкой, но нет хороших примеров или документации о том, как это сделать.
В конце концов я сделал то, что предложил Барри, и построил внешний словарь в словаре. Тем не менее, это не кажется правильным.
Однако у меня был еще один сюрприз: я пытался заменить Gabr GPStringHash с общим TDictionary. Код был немного чище с дженериками. Но суть в том, что TDictionary был в 3 раза медленнее, чем у Gabr's. 1,704,667 звонков в TryGetValue заняли 0,45 секунды, но одна и та же операция с процедурами Gabr заняла 0,12 секунды. Я не уверен, почему, но, возможно, это так же просто, как у Габра, имеющего более быструю функцию Хэша и комбинацию балансировки. Или, может быть, дженерики должны были обобщить для каждого случая, и это по сути замедляет его.
Никогда, возможно, Барри или другие разработчики Delphi должны смотреть на это, потому что 3-кратное ускорение может в конечном итоге принести пользу всем. Я бы скорее использовал то, что было встроено в язык, чем пакет сторонних разработчиков (даже такой же, как и Gabr's), если был предоставлен выбор. Но пока я буду придерживаться GPStringHash.