c# - 从嵌套对象中提取值并使用 LINQ 对它们进行排序
问题描述
我无法从一个相当复杂的对象中提取有用的信息并对其进行排序。
这是它的简化版本:
他是班级:
class myClass
{
public int id{ get; set; }
public List<mySubClass> subClasses { get; set; }
}
class mySubClass
{
public int offset { get; set; }
public int value { get; set; }
}
这是一个初始化列表:
var mm = new List<myClass> {
new myClass { id= 2,
subClasses = new List<mySubClass> {
new mySubClass { offset = 4, value = 3 },
new mySubClass { offset = 6, value = 5 },
new mySubClass { offset = 5, value = 4 } } },
new myClass { id= 2,
subClasses = new List<mySubClass> {
new mySubClass { offset = 20, value = 22 },
new mySubClass { offset = 1, value = 19 } } },
new myClass { id= 1,
subClasses = new List<mySubClass> {
new mySubClass { offset = 0, value = 1 },
new mySubClass { offset = 7, value = 6 },
new mySubClass { offset = 1, value = 2 } } } };
这是我尝试过的:
var oo = mm.OrderBy(y => y.id).SelectMany(yy => yy.subClasses.OrderBy(z => z.offset)).ToList().Select(y => y.value).ToArray();
我想要做的是将所有值提取到一个数组中并按“偏移”值对它们进行排序,但不会混淆不同的“id”。
不知何故,排序总是会变得一团糟。我认为我没有正确地对 id 进行分组,并且所有“列表< mySubClass >”最终都彼此独立对待。
预期输出应为:1,2,6,19,3,4,5,22 但我得到:1,2,6,3,4,5,19,22
编辑
在某些情况下,我也有兴趣恢复所有“mySubClass”对象。
因此,我们如何使用相同的排序标准返回“mySubClass”列表,而不是返回一个值数组?
解决方案
您必须使用SelectMany
然后将属性存储在一个类型中,例如 a ValueTuple
。然后很容易使用正确的OrderBy
... ThenBy
:
int[] result = mm
.SelectMany(x => x.subClasses.Select(y => (Id:x.id, Offset:y.offset, Value:y.value)))
.OrderBy(x => x.Id)
.ThenBy(x => x.Offset)
.Select(x => x.Value)
.ToArray();
如果您不想返回有序值,而是希望返回基于相同排序标准的有序“mySubClass”列表,该怎么办。你会怎么做?
mySubClass[] result = mm
.SelectMany(x => x.subClasses.Select(y => (Id:x.id, mySubClass:y)))
.OrderBy(x => x.Id)
.ThenBy(x => x.mySubClass.offset)
.Select(x => x.mySubClass)
.ToArray();
推荐阅读
- xamarin - 为 Xamarin 注册 Intune 后未调用 RestartApplication
- python - 如何使用while循环终止python脚本并获得结果?
- apache-spark - Spark Standalone vs YARN
- angular - 如何在我的 Angular 应用程序中包含 jwplayer?
- c++ - Issue with Font Rendering using Freetype in OpenGL is not working
- qt - 双击时 TabView 中的 QML 可编辑选项卡标题
- java - Spring Boot 2.2.0 如何接受 RequestBody 中的日期参数?
- authentication - 有没有办法自定义 laravel auth 以验证用户是否预先存储在旧表中?
- c++ - 设计自己的结果/要么:成功类型和错误类型是否应该始终是明确的?
- python - 当保存在数据库 pandas 中时,长数字正在被转换为科学计数法