C# 按枚举排序列表

标签 c# sorting enums

我有一个实体列表,其中有一个枚举。

public class Car
{
    public int CarId { get; set; }

    public string CarName { get; set; }

    public CarCategory CarCategory { get; set; }
}

public enum CarCategory
{
    None = 0,
    kLowRange = 1,
    kMidRange = 2,
    kHighRange = 3
}

现在我有一个 Cars 列表,我想使用 Comparer 并在枚举上运行它,这样所有具有 CarCategory 为 kMidRange 和 kHighRange 的实体将排在列表的第一位。

我试过 answer但还没有找到任何运气。

谢谢。

更新: 我有点犯了我正在做的错误。我在看

var sortedList = carList
  .OrderBy(x => x.CarCategory, 
                new EnumComparer<CarCategory> {
                  CarCategory.kMidRange, 
                  CarCategory.kHighRange});

但只得到相同的值。我必须添加 .ToList() 才能获得结果。

var sortedList = carList
  .OrderBy(x => x.CarCategory, 
                new EnumComparer<CarCategory> { 
                  CarCategory.kMidRange, 
                  CarCategory.kHighRange})
  .ToList();

会给我预期的结果。我的错!

最佳答案

enum 实际上是整数(在你的例子中是int)

The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

参见 https://msdn.microsoft.com/en-us/library/sbbt4032.aspx了解详情。

由于 CarCategory 实现具有所需顺序中的项目,您可以只放置

 var sortedList = carList
   .OrderByDescending(x => (int) (x.CarCategory))
   .ToList();

请注意降序:您希望kHighRange 位于顶部。如果你想要一个任意命令,例如

kMidRange, kHighRange, None, kLowRange

我建议使用映射:

 // desired order: None should be 3d, LowRange 4th, MidRange 1st, HighRange 2nd 
 int[] map = new[] {3, 4, 1, 2};

 var sortedList = carList
   .OrderBy(x => map[(int) (x.CarCategory)])
   .ToList();

关于C# 按枚举排序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42550992/

相关文章:

c# - BotFramework 消息 Controller 通过 Backchannel 设置变量

php/mysql 排序问题和表单清理?

java - 按反向日期对适配器 ArrayList 进行排序

mongodb - 在 Mongo C-Driver 中按子字段排序

c - 枚举范围

c# - System.Text.Json 和动态解析多态对象

c# - 处理图像 : Parameter is not valid

C# 基础继承

ios - 尝试使用在 Swift 中具有重复值的枚举

c# - 枚举到 Int。整数到枚举。转换的最佳方式?