如何使用我自己的逻辑排序列表(不是按字母顺序或数字)
本文关键字:顺序 数字 自己的 我自己 何使用 列表 排序 | 更新日期: 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];
有很多方法可以给这只猫添加皮肤