Как я могу использовать 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;
Так что я бы хотел обработать свой словарь в следующем порядке: тупой, ранний, HelpMe, усталый.
К сожалению, помощь Delphi очень минимальна в описании того, как работают перечислители в целом и TEnumerator, и не дает примеров, которые я могу найти. В Интернете также очень мало написано об использовании перечислителей с обобщениями в Delphi.
И мой пример кода выше даже не использует TEnumerator, поэтому я не понимаю, как все это предназначено для использования.
Спасибо, Барри, за ответ.
Мое занятие дженериками, так как я задал вопрос, было интересным. Я хотел начать реализовывать их в своем коде. Проблема «сортировки» была несколько озадачивающей, поскольку кажется, что в Generics, похоже, есть встроенные методы сортировки, но нет хороших примеров или документации о том, как это сделать.
В конце концов я сделал то, что предложил Барри, и встроил внешний словарь в словарь. Тем не менее, это не правильно.
Однако затем у меня был еще один сюрприз: я пытался заменить Gabr GPStringHash на родословную TDictionary. Код был немного чище с дженериками. Но суть в том, что TDictionary был более чем в 3 раза медленнее, чем Габр. 1 704 667 вызовов в TryGetValue заняли 0,45 секунды, но та же операция, что и в процедурах Габра, заняла 0,12 секунды. Я не уверен, почему, но, возможно, это так же просто, как у Габра более быстрая комбинация функций хэша и группирования. Или, может быть, дженерики должны были обобщать для каждого случая, и это по сути замедляет его.
Тем не менее, возможно, Барри или другим разработчикам Delphi стоит взглянуть на это, потому что ускорение в 3 раза может в конечном итоге принести пользу всем. Лично я бы скорее использовал то, что встроено в язык, чем сторонний пакет (даже такой же, как у Габра), если бы у меня был выбор. Но сейчас я буду придерживаться GPStringHash.