小编Tec*_*boy的帖子

如何使用多个比较器在TObjectList <>中按A,然后按B进行排序

我刚刚开始使用泛型,我目前在多个字段上进行排序时遇到问题.

案例:
我有一个PeopleList作为a TObjectList<TPerson>,我希望能够通过一次选择一个排序字段来制作类似Excel的排序功能,但尽可能保持先前的排序.

编辑:必须可以在运行时更改字段排序顺序.(即,在一种情况下,用户想要排序顺序A,B,C - 在另一种情况下,他想要B,A,C - 在另一个A,C,D中)

让我们说我们有一个未分类的人员列表:

Lastname     Age
---------------------
Smith        26
Jones        26
Jones        24
Lincoln      34
Run Code Online (Sandbox Code Playgroud)

现在,如果我按LastName排序:

Lastname ?   Age
---------------------
Jones        26
Jones        24
Lincoln      34
Smith        26
Run Code Online (Sandbox Code Playgroud)

然后如果我按年龄排序,我想要这个:

Lastname ?   Age ?
---------------------
Jones        24
Jones        26
Smith        26
Lincoln      34
Run Code Online (Sandbox Code Playgroud)

为了做到这一点,我制作了两个比较器 - 一个TLastNameComparer和一个TAgeComparer.

我现在打电话

PeopleList.Sort(LastNameComparer)
PeopleList.Sort(AgeComparer)
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,这不会产生我想要的输出,但是

Lastname ?   Age ?
---------------------
Jones        24
Smith        26
Jones        26
Lincoln      34
Run Code Online (Sandbox Code Playgroud)

史密斯,26岁出现在琼斯之前,26岁.所以看起来它没有保留以前的排序.

我知道我只能制作一个比较LastName和Age的比较器 - 但问题是,我必须为TPerson中存在的每个字段组合制作比较器.

是否可以使用多个TComparers做我想做的事情,或者我如何实现我想要的?

新年更新

仅供参考未来的访问者,这(几乎)是我现在使用的代码.

首先,我创建了一个基类TSortCriterion<T>,TSortCriteriaComparer<T> …

delphi sorting generics tobjectlist

19
推荐指数
2
解决办法
1071
查看次数

标签 统计

delphi ×1

generics ×1

sorting ×1

tobjectlist ×1