如果我有一个具有更多字段的泛型列表,例如:

PMyList = record
  Field1, Field2, ... FieldN : Integer;
end;
TMyList = List<PMyList>;


为了订购具有条件的列表,请选择运行时(例如:field2然后field2,或者:field3然后field1然后field2等),有一些解决方案,或者我需要对我想要的所有可能的订单组合进行比较构造吗?

我的想法是,如果记录是N字段,我想过这样定义的数组:

MyArray = array [1..n] of Integer;


并为确定sord标准的数组元素分配一个渐进值,例如,如果MyArray如下:

MyArray = (5, 1, 3, 4, 2)


意味着我的列表需要首先对字段5进行排序,然后对字段1进行排序,然后对字段3进行排序,然后对字段4进行排序,然后对字段2进行排序。
我的问题是:我可以使用一个唯一的结构来比较我的清单吗?

非常感谢您的帮助。

最佳答案

我将基于您的previous question表示法。我还要将MyArray重命名为FieldPriority

因此,FieldPriority[1]标识主要比较字段,FieldPriority[2]标识辅助比较字段,依此类推。

完成此操作后,您的compare函数将如下所示:

type
  TMyRecord  = record
    Value: array [1..5] of Integer;
  end;

function Compare(const Left, Right: TMyRecord): Integer;
var
  i, Field: Integer;
begin
  for i := 1 to 5 do
  begin
    Field := FieldPriority[i];
    Result := CompareInt(Left.Value[Field], Right.Value[Field]);
    if Result<>0 then
      exit;
  end;
end;


如果将记录中的整数声明为数组而不是单独声明为整数,则效果会更好。这样一来,您就可以像在这里一样为它们建立索引。

自然,所有这些都可以概括为处理任意大小的数组。

关于delphi - 带条件的订单 list 选择运行时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8376182/

10-13 05:06