C#按Enum排序列表

时间:2017-03-02 09:06:20

标签: 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
}

现在我有一个汽车列表,我想使用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();

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

1 个答案:

答案 0 :(得分:11)

在您的情况下,

enum有效整数int

  

枚举的已批准类型是byte,sbyte,short,ushort,int,   uint,long或ulong。

有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/sbbt4032.aspx

由于CarCategory实施具有所需订单中的项目,您只需

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

请注意Descending:您希望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();