C# 按枚举排序列表

问题描述 投票:0回答:2

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

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 的实体将被排序到列表中的第一个。

我已经尝试过答案,但没有找到任何运气。

谢谢。

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

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();

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

c# sorting enums
2个回答
45
投票

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();

0
投票

我想补充Dmitry Bychenko答案

问题

  1. 如果 enam 计数未排序
  2. 如果值的个数可能超出
    map
    数组的边界
  3. 如果
    map
    数组没有一些数字(当您向枚举添加值,但不向
    map
    数组添加值时)

比我们得到

System.IndexOutOfRangeException

例如

public enum CarCategory
{
    None = 0,
    kLowRange = 30,
    kMidRange = 2000,
    kHighRange = 10,
    kAnotherRangeCarCategory = 10000,
}

比使用 Dmitry 代码

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

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

异常

System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'

解决方案

var map = new Dictionary<CarCategory, int>() {
    { CarCategory.kMidRange, 0 },
    { CarCategory.kHighRange, 1 },
    { CarCategory.None, 2 },
    { CarCategory.kLowRange, 3 }
    // without "kAnotherRangeCarCategory"
};
// Order by map, if map doesn't contains enum value, push item to end.
var sortedList = carList
   .OrderBy(x => map.GetValueOrDefault(key: x.CarCategory, defaultValue: map.Count + 1)) 
   .ToList();

此代码工作正确且不会抛出

System.IndexOutOfRangeException

附注您还可以使用字符串代替枚举

© www.soinside.com 2019 - 2024. All rights reserved.