Delphi/C++Builder Generics TList(TObjectList) と無名関数でソートと元の順序

Generics TList と匿名関数のソートメモ

TList<THogehoge> を匿名関数でソートする場合
System.Generics.Defaults の TComparer を挟んで、function の const もお忘れ無く
uses Generics.Collections, System.Generics.Defaults;

ItemList.Sort(TComparer<THogehoge>.Construct(
    function(const Item1, Item2: THogehoge): Integer
    begin

    end));

【捕捉】
上記はクイックソートで行われるため、Item1 と Item2 の比較が同じだと元の順序が保たれない場合があるので、Compare結果が同じ場合、私は元の順序であるリストインデックスで比較したりしてます
// 日付の例
if (Item1.date = Item2.date) then begin
    Result := ItemList.IndexOf(Item1) - ItemList.IndexOf(Item2);
end else begin
    Result := CompareDate(Item1.date, Item2.date);
end;

コメント