2012-03-18 9 views
3

TDictionary<TKey,TValue>のキーリストを取得し、その順序を逆にする簡単な方法はありますか?TDictionary <TKey,TValue>の逆のキーリストを作成する簡単な方法は?

私は古典的なI:= ...ループを使うことができましたが、Generics.CollectionsにはTList<T>.Reverseがあります。おそらくもっと良い方法と短い方法があります。


アップデート:私のために:=最良の方法ので、同じ無用順序がありますループとdownto TDictionaryで別々のTList<TKey>

答えて

7

キーを使用している順不同です。このクラスは、その順序を保証するものではなく、実際に使用される順序は、それらが追加された順序ではありません。順序付けられていない辞書の順序を逆にすることは無意味な操作です。

デルファイには、サードパーティのクラスがありますが、順序付き辞書クラスはありません。あなたの使い方が比較的シンプルであれば、希望の順序でキーを含む余分なリストで管理することができます。

+1

別のリストを使用するには、 'のみ' ソリューション、多くの感謝です! – mjn

0

私の場合は、TDictionary < Tkey、TValue>を使用します。 TKeyCollectionクラス。使用の

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; 
関連する問題