c# - C# 对 IEnumerable 的 IEnumerable 进行排序
问题描述
我有一个看起来像这样的对象:
public class MyObj
{
public string Title { get; set; }
public IEnumerable<Section> Sections { get; set; }
}
public class Section
{
public string Title { get; set; }
public IEnumerable<Item> Items { get; set; }
public int SortOrder { get; set; }
}
public class Item
{
public string Title { get; set; }
public int SortOrder { get; set; }
}
本质上,我最终得到了一个 IEnumerable 部分,而这些部分又包含一个 IEnumerable 项目。部分列表和项目都需要按其各自的 SortOrder 属性进行排序。
我知道我可以通过做来对部分进行排序,obj.Sections.OrderBy(s => s.SortOrder)
但是我也不知道如何对每个部分中的项目进行排序。
上下文是我正在编写一个 Sort 函数,它接受一个未排序的 MyObj 并返回一个,其中部分和项目都已排序。
public MyObj Sort(MyObj unsortedObj)
{
var sortedObj = unsortedObj.....
return sortedObj;
}
预期的数据结构将是这样的:
- Section1
- Item1
- Item2
- Section2
- Item1
- Item2
解决方案
除了一个属性不同之外,添加创建这些对象副本的方法会很方便:
// in MyObj
public MyObj WithSections(IEnumerable<Section> sections) =>
new MyObj {
Title = this.Title,
Sections = sections
};
// in Section
public Section WithItems(IEnumerable<Items> items) =>
new Section {
Title = this.Title,
Items = items,
SortOrder = this.SortOrder
};
首先,对部分进行排序
var sortedSections = unsortedObj.Sections.OrderBy(x => x.SortOrder);
然后对于每个排序的部分,将它们转换为,Select
以便它们的项目也被排序:
var sortedSectionsAndItems = sortedSections.Select(x => x.WithItems(x.Items.OrderBy(y => y.SortOrder)));
现在您可以返回MyObj
带有排序的部分和项目的 a:
return unsortedObj.WithSections(sortedSectionsAndItems);
推荐阅读
- c# - 加载资源失败:服务器响应状态为 500(内部服务器错误)asp.net
- vb.net - 为什么单击显示时它总是替换第一个数据?
- java - 在旧版本的 android studio 上迁移到 androidx,即 3.1.2?
- class - 关于 UML 类模型中的 1 对 1 关联
- javascript - 如何在生产中禁用 console.log() 并显示横幅?
- c - 为什么这个倒置句子算法不起作用?
- javascript - 在列表中添加链接以显示其数据
- vue.js - Vue中值绑定中的字符串连接
- canvas - 在 html5 破砖游戏中,砖块消失了,但球却从他们身上弹了出来
- android - Firebase + Ionic + Cordova signInWithRedirect 重定向到 Android 上的 localhost