我有一个实体列表,其中有一个枚举。
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();
会给我预期的结果。我的错!
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();
问题
map
数组的边界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
附注您还可以使用字符串代替枚举