如何使用我自己的逻辑对列表进行排序(不按字母顺序或数字排序)
我花了最后30分钟浏览现有答案,以了解我认为是一个常见问题,但没有什么比较适合我。道歉,如果这是一个骗局。如何使用我自己的逻辑对列表进行排序(不按字母顺序或数字排序)
我有一个对象列表。
List<Journey> journeys;
该对象具有'status'属性 - 这是一个字符串。
class Journey
{
public string Name;
public string Status;
}
我想根据此字符串排序,但不是按字母顺序排序。状态描述了对象在旅途中的位置,即“航路”,“完成”或“错误”。按升序排序时,我希望它们按以下顺序显示:“错误”,“路由”,“完成”。 (实际上有更多的状态比这个更重要,所以重命名它们以字母顺序不是一个选项)
除了创建一个'状态'的值与排序顺序属性,然后根据它进行排序,我该怎么做呢?或者那是最好的方法?
您可以自定义函数里面的你排序逻辑被提供给Comparison代表:从Comparer<T>
或StringComparer
类
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
}));
除了创建一个具有值和排序顺序属性的'状态'的类,然后根据它进行排序,我该怎么做?
因为这是你需要建立这样一个类中的一些自定义的顺序是一个好主意。
您需要创建一个类来实现IComparer<Journey>
并相应地实现Compare
方法。
你没有提到你是如何精确排序的,但几乎所有涉及排序的BCL方法都有一个接受IComparer
的过载,因此你可以插入你的逻辑。
导出,用你的自定义逻辑实现类,通过这个类的一个实例来排序方法。
只是一种思路:
class Journey
{
public enum JourneyStatus
{
Enroute,
Finished,
Error
}
public string Name;
public JourneyStatus Status;
}
使用排序依据:
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
或者你可以修改拉姆达传递给排序依据映射状态的值字符串到int
。
在某些情况下,您可能想要实施IComparer<T>
,就像Jon说的那样。它可以帮助保持排序逻辑和类定义本身在一个地方。
这样做的一种方法是为每个项目分配一个订单号。因此,创建一个数据库表来保存你的项目以及顺序:
Column Name, Column Order
Enrout , 0
Finished, 1
Error, 2
后来,当我填充下拉我可以在我的SQL选择,而不是名称进行排序。或者如果你不想使用数据库,你可以改变状态来包含命令,然后解析出状态名称:所以状态值可能如下所示:“0,Enrout”,“1,”,“0”,“0”,“完成“,”2,错误“,那么它会自然排序。然后,只需用分裂的顺序从名字分开:
string[] statusArr = status.split(',');
string order = statusArr[0];
string statusname = statusArr[1];
有很多的方式去给这只猫的皮肤。