如何在C#中对IList<IList<Result>>按DisplayOrder属性排序
解决
IList<IList<Result>>按子元素DisplayOrder排序的异常问题 首先看你遇到的异常,核心原因是你在OrderBy里用x.OrderBy(y => y.DisplayOrder)作为排序键,这会返回一个IOrderedEnumerable<Result>类型的对象,而这个类型并没有实现IComparable接口,所以Linq在尝试比较两个这样的排序键时,就会抛出"至少一个对象必须实现IComparable"的错误。
结合你描述的场景:每个子列表只包含一个Result对象,其实根本不需要对子列表内部排序,直接取子列表里唯一的那个Result的DisplayOrder作为排序依据就可以了。
修正后的代码
IList<IList<Result>> results = validationResults .OrderBy(x => x.First().DisplayOrder) .ToList();
为什么这样能解决问题?
- 因为每个子列表只有一个元素,
x.First()可以安全地获取到子列表里的Result对象 - 直接用
DisplayOrder(数值类型,天然实现IComparable)作为排序键,Linq可以正常比较排序
用你的测试数据验证:
输入的validationResults是:
[ [ { "fieldName": "AccountName", "displayOrder": 5 } ], [ { "fieldName": "AccountNumber", "displayOrder": 6 } ], [ { "fieldName": "BankAddress", "displayOrder": 4 } ] ]
修正后的代码会按照displayOrder的4→5→6顺序排序,正好得到你期望的结果:
[ [ { "fieldName": "BankAddress", "displayOrder": 4 } ], [ { "fieldName": "AccountName", "displayOrder": 5 } ], [ { "fieldName": "AccountNumber", "displayOrder": 6 } ] ]
额外提示
如果担心子列表可能为空(虽然你说每个子列表仅含一个元素),可以用FirstOrDefault()做安全处理,比如:
.OrderBy(x => x.FirstOrDefault()?.DisplayOrder ?? int.MaxValue)
这样空的子列表会被排到最后。
内容的提问来源于stack exchange,提问作者Vivek Nuna
相关产品推荐
相关产品推荐

