Сортировка массива структур

Здравствуйте! Стандартный метод сортировка динамического массива Sort() понятно, как можно использовать. Подскажите, как можно задействовать этот метод, если необходимо отсортировать по атрибуту “Timei”?


type Bank = record Id: string; Timei: integer; Itypi: string; end;

var i, j, n: integer; M: array of Bank;

Реализовать интерфейс IComparable

type
  Bank = record(IComparable<Bank>)
    Id: string;
    Timei: integer;
    Itypi: string; 
    
    public function CompareTo(other: Bank): integer;
    begin
      Result := Timei.CompareTo(other.Timei);
    end;
  end;

begin
  var arr := new Bank[10];
  arr.Sort();
end.

Ну или вот так, если неохота разбираться в интерфейсах и не обязателен именно Sort:

type
  Bank = record
    Id: string;
    Timei: integer;
    Itypi: string; 
  end;

begin
  var arr := new Bank[3];
  arr[0].Id := '001';
  arr[0].Timei := 5;
  arr[0].Itypi := '101';
  arr[1].Id := '002';
  arr[1].Timei := 9;
  arr[1].Itypi := '102';
  arr[2].Id := '003';
  arr[2].Timei := 2;
  arr[2].Itypi := '103';
  arr := arr.OrderBy(t -> t.Timei).ToArray;
  Write(arr)
end.

@Ivan_Ivasenko используйте следующий синтаксис маркдауна (Markdown) чтоб вставлять код:

```
код
```

Символ ` находится за ё в англ. раскладке.


.Order.ToArray это очень не эффективно.
Интерфейс можно реализовать только для 1 поля.
Если надо сортировать по разным полям в разных частях кода - есть 2 варианта:

  1. Использовать вторую перегрузку .Sort, принимающую лямбду:
type
  Bank = record
    Id: string;
    Timei: integer;
    Itypi: string; 
  end;
  
begin
  var arr := new Bank[10];
  //ToDo заполнение
  arr.Sort((bank1, bank2)->bank1.Timei.CompareTo(bank2.Timei));
  arr.PrintLines;
end.
  1. Объявить отдельный тип-сравниватель:
type
  Bank = record
    Id: string;
    Timei: integer;
    Itypi: string; 
  end;
  
  BankTimeiComparer = class(IComparer<Bank>)
    
    public function Compare(x, y: Bank): integer :=
    x.Timei.CompareTo(y.Timei);
    
  end;
  
begin
  var arr := new Bank[10];
  //ToDo заполнение
  System.Array.Sort(arr, new BankTimeiComparer);
  arr.PrintLines;
end.

Array.Sort более мощный чем .Sort, у него есть куча перегрузок для различных нужд (как сортировка только части массива).

А .Sort больше подходит когда вам нужен более простой функционал.

Спасибо! Попробуем.

 Институт математики, механики и компьютерных наук ЮФУ, 2005–2018
Администрация форума: В.Н. Брагилевский, С.С. Михалкович, А.М. Пеленицын
Yandex.Metrica