Простой способ создать список обращенных ключей TDictionary <TKey, TValue>? - PullRequest
3 голосов
/ 18 марта 2012

Есть ли простой способ взять список ключей из TDictionary<TKey,TValue> и изменить его порядок?

Я мог бы использовать классический цикл I: = ... но какЯ вижу, что в Generics есть TList<T>.Reverse. Возможно, есть лучший / более короткий путь.


Обновление: a для цикла I: = downto будет иметь тот же бесполезный порядоктак что лучше всего использовать отдельный TList<TKey>

Ответы [ 2 ]

7 голосов
/ 18 марта 2012

Ключи в TDictionary неупорядочены.Этот класс не дает никаких гарантий в отношении их заказа, и фактический используемый порядок не является порядком их добавления.Изменение порядка неупорядоченного словаря является бессмысленной операцией.

Delphi не поставляется с упорядоченным классом словаря, хотя существуют доступные сторонние классы.Если ваше использование относительно простое, вы можете управлять с помощью дополнительного списка, содержащего ключи в нужном порядке.

0 голосов
/ 11 апреля 2013

В моем случае я использую TDictionary . TKeyCollection class.

function compareKeyReverse(const L, R: TKey): Integer;
begin
  // Reverse compare keys
  // if TKey = String, uncomment code below
  // Result := - SysUtils.CompareText(L, R);
end;

function getReverseSortedKeyArray(dictionary: TDictionary<TKey, TValue>): TArray<TKey>;
var
  keyArray: TArray<TKey>;
  keyCollecttion: TDictionary<Tkey, TValue>.TKeyCollection;
begin
  keyCollecttion:= TDictionary<Tkey, TValue>.TKeyCollection.Create(dictionary);
  try
    keyArray:= valueCollecttion.ToArray;
    TArray.Sort<Tkey>(keyArray, TComparer<Tkey>.Construct(compareKeyReverse));
  finally
    keyCollecttion.Free;
  end;

  Result := keyArray;
end;

Пример использования:

var
  key: TKey;
  keyArray : TArray<TKey>;
begin
    keyArray  := getReverseSortedKeyArray (dictionary);
    for key in keyArray  do
    begin
      // ...
    end;
end;
...