如何使用LINQ根据Enum顺序对C#列表对象进行排序
]
我尝试了以下代码但未达到预期效果: ```csharp var a = myList.OrderBy(x => x.W).ToList();
解决方案
你之前的代码直接按字符串x.W排序,是按照字母顺序排列(比如"Five"会排在"Four"前面),而不是枚举的定义顺序。要实现按枚举顺序排序,需要把字符串W转换为对应的Number枚举值,再按枚举的数值排序:
方法1:直接转换枚举后排序
var sortedList = myList.OrderBy(x => (Number)Enum.Parse(typeof(Number), x.W)).ToList();
枚举默认会按定义顺序分配数值(从0开始递增),所以将字符串解析为枚举后直接排序,就能匹配你想要的顺序。
方法2:添加无效值处理(可选)
如果列表中可能存在无法解析为Number的W值,可以用Enum.TryParse做验证,把无效值放到排序末尾:
var sortedList = myList.OrderBy(x => { if (Enum.TryParse(typeof(Number), x.W, out object enumVal)) { return (Number)enumVal; } // 给无效值分配一个比最大枚举值更大的数值,让它排最后 return (int)Number.Five + 1; }).ToList();
方法3:预建映射字典(性能优化)
如果列表数据量较大,预创建字符串到枚举数值的字典可以避免重复解析,提升性能:
// 提前构建枚举名称到数值的映射 var enumOrderMap = Enum.GetValues(typeof(Number)) .Cast<Number>() .ToDictionary(e => e.ToString(), e => (int)e); // 用映射字典排序 var sortedList = myList.OrderBy(x => enumOrderMap[x.W]).ToList();
内容的提问来源于stack exchange,提问作者user2580179
相关产品推荐
相关产品推荐

