我有一个实体列表,其中有一个枚举。
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/