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;
したがって、辞書を次の順序で処理したいと思います: ダム、アーリー、ヘルプミー、タイテッド。
残念ながら、Delphi のヘルプでは、一般的な列挙子と TEnumerator が具体的にどのように機能するかについての説明が非常に少なく、私が見つけることができる例はありません。また、Delphi でジェネリックを使用して列挙子を使用する方法については、ウェブ上でほとんど書かれていません。
また、上記のサンプル コードは TEnumerator を使用していないため、これがどのように使用されるように設計されているかについて混乱しています。
バリー、答えてくれてありがとう。
質問をしてからのジェネリックへの冒険は興味深いものでした。私は自分のコードにそれらを実装したいと思っていました。ジェネリックにはソートを処理するメソッドが組み込まれているように見えるため、「ソート」の問題はやや困惑していましたが、それを行う方法に関する良い例やドキュメントはありません。
最後に、Barry が提案したことを実行し、外部インデックスを Dictionary に組み込みました。それでも、それは正しくありません。
ただし、別の驚きがありました。 Gabr の GPStringHash を Generic の TDictionary に置き換えようとしていたのです。コードは、ジェネリックによって少しきれいになりました。しかし、結論としては、TDictionary は Gabr の 3 倍以上遅いということでした。TryGetValue への 1,704,667 回の呼び出しには 0.45 秒かかりましたが、Gabr のルーチンに対する同じ操作には 0.12 秒かかりました。理由はわかりませんが、Gabr がより高速なハッシュ関数とバケットの組み合わせを持っているのと同じくらい単純かもしれません。あるいは、すべてのケースに対してジェネリックを一般化する必要があり、それが本質的に速度を低下させているのかもしれません。
それでも、Barry や他の Delphi 開発者はこれを検討する必要があります。個人的には、選択肢があれば、サードパーティのパッケージ (Gabr と同じくらい良いものでも) よりも、言語に組み込まれているものを使用する方が早いでしょう。しかし、今のところ、GPStringHash に固執します。