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

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

TList<THogehoge> を匿名関数でソートする場合
System.Generics.Defaults の TComparer を挟んで、function の const もお忘れ無く
  1. uses Generics.Collections, System.Generics.Defaults;  
  2.   
  3. ItemList.Sort(TComparer<THogehoge>.Construct(  
  4.     function(const Item1, Item2: THogehoge): Integer  
  5.     begin  
  6.   
  7.     end));  

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

コメント