Часто использую TStringList, а вот сортировку в нём не часто. Понадобилась, разобрался, ниже основные моменты по сортировке разных типов, тем или иным путем попавшим в TStringList.
Сортировка строк
1 |
var FRandomList:TStringList; |
Ascending
Вариант 1 (самый популярный, поэтому самый краткий)
1 |
FRandomList.Sort |
Все остальные функции – через так называемые функции компараторы – они позволяют задать тип данных, с которым мы работаем, а также направление сортировки – по возрастанию или по убыванию.
Вариант 2
1 2 3 4 5 6 7 |
function CompareStringsAscending(List: TStringList; Index1, Index2: Integer): Integer; begin Result := CompareText(List[Index1], List[Index2]); end; FRandomList.CustomSort(CompareStringsAscending); // Отсортирует в обратном порядке |
Descending
1 2 3 4 5 6 7 |
function CompareStringsDescending(List: TStringList; Index1, Index2: Integer): Integer; begin Result := CompareText(List[Index2], List[Index1]); end; FRandomList.CustomSort(CompareStringsDescending); // Отсортирует в обратном порядке |
Сортировка integer
Ascending
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function CompareIntegersAsc(List: TStringList; Index1, Index2: Integer): Integer; var d1, d2: integer; begin d1 := List[Index1].ToInteger; d2 := List[Index2].ToInteger; if d1 < d2 then Result := -1 else if d1 > d2 then Result := 1 else Result := 0; end; FRandomList.CustomSort(CompareIntegersAsc); |
Descending
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function CompareIntegersDesc(List: TStringList; Index1, Index2: Integer): Integer; var d1, d2: integer; begin d1 := List[Index1].ToInteger; d2 := List[Index2].ToInteger; if d1 > d2 then Result := -1 else if d1 < d2 then Result := 1 else Result := 0; end; FRandomList.CustomSort(CompareIntegersDesc); |
Сортировка TDateTime
Ascending
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function CompareDatesAsc(List: TStringList; Index1, Index2: Integer): Integer; var d1, d2: TDateTime; begin d1 := StrToDateTime(List[Index1]); d2 := StrToDateTime(List[Index2]); if d1 < d2 then Result := -1 else if d1 > d2 then Result := 1 else Result := 0; end; FRandomList.CustomSort(CompareIntegersAsc); |
Descending
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function CompareDatesDesc(List: TStringList; Index1, Index2: Integer): Integer; var d1, d2: TDateTime; begin d1 := StrToDateTime(List[Index1]); d2 := StrToDateTime(List[Index2]); if d1 > d2 then Result := -1 else if d1 < d2 then Result := 1 else Result := 0; end; FRandomList.CustomSort(CompareIntegersDesc); |
С остальными типами по аналогии, принцип, думаю понятен.