如何使用我自己的逻辑排序列表(不是按字母顺序或数字)

本文关键字:顺序 数字 自己的 我自己 何使用 列表 排序 | 更新日期: 2023-09-27 18:09:36

我花了30分钟的时间浏览了现有的答案,我认为这是一个常见的问题,但没有一个很适合我。对不起,如果这是一个骗局。

我有一个对象列表。

List<Journey> journeys;

对象有一个'status'属性-这是一个字符串。

class Journey
{
    public string Name;
    public string Status; 
}

我想基于这个字符串排序,但不是按字母顺序排序。状态描述了对象在旅程中的位置,可以是"途中"、"完成"或"错误"。当升序排序时,我希望它们以以下顺序出现:"Error", "Enroute", "Finished"。(实际上有更多的状态,所以不能按字母顺序重命名它们)

除了为'status'创建一个带有值和排序顺序属性的类,然后根据它进行排序,我该怎么做呢?还是说这是最好的方法?

如何使用我自己的逻辑排序列表(不是按字母顺序或数字)

您可以在提供给比较委托的自定义函数中定义您的排序逻辑:

List<Journey> list = new List<Journey>();
list.Sort(new Comparison<Journey>((Journey source, Journey compare) => 
{ 
    // here is my custom compare logic
    return // -1, 0 or 1
}));

又一个想法:

class Journey
{
    public enum JourneyStatus
    {
        Enroute,
        Finished,
        Error
    }
    public string Name;
    public JourneyStatus Status;
}

与OrderBy:

连用
var journeys = new List<Journey>();
journeys.Add(new Journey() { Name = "Test1", Status = Journey.JourneyStatus.Enroute });
journeys.Add(new Journey() { Name = "Test2", Status = Journey.JourneyStatus.Error });
journeys.Add(new Journey() { Name = "Test3", Status = Journey.JourneyStatus.Finished });
journeys.Add(new Journey() { Name = "Test4", Status = Journey.JourneyStatus.Enroute });
journeys = journeys.OrderBy(x => x.Status).ToList();
foreach (var j in journeys)
    Console.WriteLine("{0} : {1}", j.Name, j.Status);
输出:

Test1 : Enroute
Test4 : Enroute
Test3 : Finished
Test2 : Error

或者您可以修改传递给OrderBy的lambda以将Status字符串的值映射到int

在某些情况下,您可能希望实现IComparer<T>,就像Jon所说的那样。它可以帮助将排序逻辑和类定义本身保持在一个地方。

您需要创建一个实现IComparer<Journey>的类,并相应地实现Compare方法。

你没有提到你是如何排序的,但是几乎所有涉及排序的BCL方法都有一个接受IComparer的过载,这样你就可以插入你的逻辑。

除了为'status'创建一个带有值和排序顺序属性的类,然后根据它进行排序,我该怎么做呢?

由于这是您需要的一些自定义订单,因此创建这样的类是一个好主意。

Comparer<T>StringComparer类派生,使用自定义逻辑实现类,将该类的实例传递给排序方法

这样做的一种方法是为每个项目分配一个订单号。因此,创建一个数据库表来保存您的项目及其顺序:

Column Name, Column Order
Enrout , 0
Finished, 1
Error, 2

然后,当我填充下拉菜单时,我可以根据SQL选择中的顺序而不是名称进行排序。

或者,如果你不想使用数据库,你可以改变状态,包括订单,然后只是解析出状态名称:所以状态值可能看起来像这样:"0,Enrout","1,Finished","2,Error",然后它会自然排序。然后使用split将顺序与名称分开:

string[] statusArr = status.split(',');
string order = statusArr[0];
string statusname = statusArr[1];

有很多方法可以给这只猫添加皮肤