delphi 如何按两个(或更多)类成员对TObjectList进行排序?

sgtfey8w  于 2023-04-11  发布在  其他
关注(0)|答案(2)|浏览(92)

假设一个非常简单的对象

TPerson = class
private 
    name : String;
    DateOfBirth: TDatetime;
end;
.
.
aList : TObjectList<TPerson>;
.
.

假设aList是这样填充的:
| 名称|出生日期|
| --------------|--------------|
| 亚当|2023年1月1日|
| 爱丽丝|2019 - 02 - 21|
| 亚当|2022年1月1日|
如何按姓名和生日对列表排序?
我尽力了

aList.sort(TComparer<TPerson>.Construct(
      function (const L, R: TPerson): integer
      begin
         if L.name=R.name then
            Result:=0
         else if L.name< R.name then
            Result:=1
         else
            Result:=-1;
      end));

这工程的名称,但在同一个名称,我想排序的出生日期太
我希望我的对象以这种方式排序:
| 名称|出生日期|
| --------------|--------------|
| 亚当|2022年1月1日|
| 亚当|2023年1月1日|
| 爱丽丝|2019 - 02 - 21|
怎么做呢?
我用的是 Delphi XE 10

55ooxyrt

55ooxyrt1#

当两个名字比较相同时,你需要比较他们的生日并返回结果,例如:

aList.sort(TComparer<TPerson>.Construct(
      function (const L, R: TPerson): integer
      begin
         if L.name = R.name then
         begin
            if L.DateOfBirth = R.DateOfBirth then
               Result := 0
            else if L.DateOfBirth < R.DateOfBirth then
               Result := 1
            else
               Result := -1;
         end
         else if L.name < R.name then
            Result := 1
         else
            Result := -1;
      end));

或者,也有RTL函数可用于比较字符串和日期,例如:

aList.sort(TComparer<TPerson>.Construct(
      function (const L, R: TPerson): integer
      begin
         Result := CompareStr(L.name, R.name);
         if Result = 0 then 
            Result := CompareDate(L.DateOfBirth, R.DateOfBirth);
         Result := -Result;
      end));
ktca8awb

ktca8awb2#

只处理Name属性匹配的情况。

AList.Sort(TComparer<TPerson>.Construct(
  function (const L, R: TPerson): Integer
  begin
     if L.Name = R.Name then
     begin
       if L.DateOfBirth = R.DateOfBirth then Exit(0);
       if L.DateOfBirth < R.DateOfBirth then Exit(1);
       Exit(-1);
     end;
     if L.Name < R.Name then Exit(1);
     Result := -1;
  end));

相关问题