Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Работа с IComparer<T> при работе с коллекциями


Автор: sibedir 21.3.2023, 09:57
Не могу понять логику применения/использования IComparer<T> при работе с дженериками коллекций. При создании TList<ТAnyType> можно указать экземпляр интерфейса IComparer<T>. Таким образом, если для экземпляра какого-то типа/класса (ТAnyType) определена своя логика сравнения, то её можно передать в список. (если не определена, он, грубо говоря, будет сравнивать побайтно используя TComparer<T>.Default)
Допустим теперь, что мне нужно выбрать элементы из такого списка, сравнивая их с заданным. Т.е.
Есть List = TList<ТAnyType> и есть Something = ТAnyType. И мне нужно, например, удалить из списка все элементы, которые меньше Something. НО! Тип ТAnyType разрабатываю не я и список List создаю не я. И мне не известно заранее имеет ли ТAnyType свой TComparer и назначен ли он при создании списка.

Вопрос: Как из конкретного экземпляра TList<ТAnyType> вытащить его Comparer? Или я вообще не понимаю тут логигу использования IComparer<T>?

Просто ну как-то странно, если для элементов вот конкретного списка есть конкретный алгоритм сравнения и о ней знает список, то почему бы списку не расшарить информацию об этом алгоритме? Зачем они его скрыли? Например я сижу в приёмной коммисии. Приходят и уходят соискатели на курсы (TCandidate). Есть список этих абитуриентов TEnrolleeList = TList<TCandidate>. Его создал декан и при создании указал каким именно способом сравнивать их между собой (в контексте конкретно этого списка) OurEntrants := TEnrolleeList.Create(TSpecEnrolleeComparer). Я периодически сортирую список. При чём мне для этого не нужно знать метод сравнения. Тупо выполняю OurEntrants.Sort. Тут приводят несколько соискателей и спрашивают, у кого из них больше шансов поступить конкретно на наши курсы? А декана нет на месте и TSpecEnrolleeComparer в его кабинете под замком.

Автор: sibedir 26.3.2023, 10:23
Вот и весь хрен до копейки. Скачал последнюю версию RAD
Код

  TList<T> = class(TEnumerable<T>)
...
  public
...
    property Items[Index: Integer]: T read GetItem write SetItem; default;
    property List: arrayofT read GetList;
    property PList: ParrayofT read GetPList;
    property Comparer: IComparer<T> read FComparer;
...
  end;

Парам-парам-пам. Пам.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)