如何用LINQ在VB.NET中按Topic及子Indicator升序排序嵌套列表?
VB.NET中用LINQ实现嵌套列表的双层排序
当然可以用LINQ实现这个需求,核心是通过OrderBy分别处理外层Topic和内层Indicator的排序逻辑,以下是两种常见实现方式:
方式一:修改原对象的Indicators列表
这种方式会直接调整原Topic对象中的Indicators排序,同时生成排序后的Topic列表:
' 按Topic的name升序排序,同时对每个Topic下的Indicator按name升序排序 Dim sortedTopics = topics _ .OrderBy(Function(topic) topic.name) _ .Select(Function(topic) ' 对当前Topic的Indicators排序后重新赋值 topic.Indicators = topic.Indicators.OrderBy(Function(ind) ind.name).ToList() Return topic End Function) _ .ToList()
方式二:生成新的对象(不修改原数据)
如果不想改动原Topic对象的内容,可以创建新的Topic实例,保留原数据的同时生成排序后的结果:
Dim sortedTopics = topics _ .OrderBy(Function(topic) topic.name) _ .Select(Function(topic) Return New Topic With { .id = topic.id, .name = topic.name, .Indicators = topic.Indicators.OrderBy(Function(ind) ind.name).ToList() } End Function) _ .ToList()
关键逻辑说明
- 外层
OrderBy(Function(topic) topic.name):实现所有Topic按name字段升序排列 - 内层
OrderBy(Function(ind) ind.name):对每个Topic下的Indicator列表按name字段升序排列,最后通过ToList()将IEnumerable转换为List类型
注:你提供的示例代码存在变量复用问题(重复使用同一个
t和i对象,未重新实例化),会导致最终topics列表中的数据不符合预期,建议在创建第二个Topic和新Indicator时重新执行New Topic()和New Indicator()。
内容的提问来源于stack exchange,提问作者Bobbin Paulose
相关产品推荐
相关产品推荐

