如何在C#中使用Linq按嵌套字典值对List集合进行排序
错误原因
你传入OrderBy的参数返回的是IEnumerable<dynamic>类型的集合序列,不是单个可比较的值,排序逻辑无法直接对集合序列做大小比较,因此抛出了要求实现IComparable接口的异常。
解决方法
你只需要直接取出字典中Smile键对应的单个值,显式转换为你实际存储的可比较类型(比如int、string等)即可,按实际场景可选用两种写法:
- 确定所有
Col对象的Dt字典都包含Smile键,且值类型统一
// 示例中假设Smile对应的值是int类型,你可以根据实际存储的类型替换转换逻辑 var sortedList = list.OrderBy(x => (int)x.Dt["Smile"]).ToList();
- 不确定是否存在
Smile键,需要做异常兼容
var sortedList = list.OrderBy(x => { if (x.Dt.TryGetValue("Smile", out var value)) { // 转换为实际存储的类型,示例为int return (int)value; } // 不存在该键的对象默认排到最后,可根据需求调整默认值 return int.MaxValue; }).ToList();
如果需要降序排序,把OrderBy替换为OrderByDescending即可。
内容的提问来源于stack exchange,提问作者Betsq9
相关产品推荐
相关产品推荐

