Как я могу перечислить TDictionary в алфавитном порядке ключом в Delphi 2009?

Как я могу использовать TEnumerator для прохождения через моего TDictionary в отсортированном порядке ключом?

У меня есть что-то вроде этого:

  var
    Dic: TDictionary;
    Enum: TPair;

  begin
    Dic := TDictionary.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, таким образом, я смущен относительно того, как это все разработано, чтобы использоваться.


Спасибо Barry, для Вашего ответа.

Мое предприятие в Дженерики, так как я задал вопрос, было интересно. Я хотел начать реализовывать их в своем коде. Проблема "сортировки" была несколько озадачивающей, так как кажется, что Дженерики, кажется, имеют методы, имеющие дело со встроенной сортировкой, но нет никаких хороших примеров или документации относительно того, как сделать это.

В конце я сделал то, что предложенный Barry и встроил внешний индекс в Словарь. Однако, это не чувствует себя хорошо.

Однако затем у меня было другое удивление: Я пытался заменить GPStringHash Gabr TDictionary Дженерика. Код был немного более чистым с дженериками. Но нижняя строка была то, что TDictionary был более чем в 3 раза медленнее, чем Gabr. 1 704 667 вызовов к TryGetValue заняли.45 секунд, но та же операция к стандартным программам Gabr заняла.12 секунд. Я не уверен почему, но возможно его столь же простой как Gabr, имеющий более быструю Хеш-функцию и объединяющий комбинацию в блок. Или возможно дженерики должны были сделать вывод для каждого случая, и это по сути замедляет его.

Тем не менее, возможно, Barry или другие разработчики Delphi должны посмотреть на это, потому что ускорение 3 раз могло в конечном счете принести пользу всем. Я лично использовал бы то, что встроено в язык, чем сторонний пакет (даже один столь же хороший как Gabr), если дали выбор. Но на данный момент, я буду придерживаться GPStringHash.

19
задан Community 23 May 2017 в 12:18
поделиться

1 ответ

Словарь - это хэш-таблица, поэтому он не хранит элементы в отсортированном порядке. TEnumerator прост - это просто средство итерации по элементам.

Чтобы получить элементы в порядке, их нужно отсортировать. Один из способов - поместить их в список и отсортировать список, например, так:

var
  list: TList<string>;
begin
  list := TList<string>.Create(Dic.Keys);
  try
    list.Sort;
    // process sorted list of items now
  finally
    list.Free;
  end;
end;
21
ответ дан 30 November 2019 в 04:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: