C# 从嵌套对象提取值并使用LINQ对其排序

C# 从嵌套对象提取值并使用LINQ对其排序,c#,linq,sorting,C#,Linq,Sorting,我无法从一个相当复杂的对象中提取有用的信息并对其进行排序。 以下是它的简化版本: 他是下列班级的学生: 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; }

我无法从一个相当复杂的对象中提取有用的信息并对其进行排序。
以下是它的简化版本:

他是下列班级的学生:

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; }
}
我要做的是将所有值提取到一个数组中,并按“offset”值对它们进行排序,但不要混淆不同的“id”

不知何故,订购总是以混乱告终。我认为我没有正确地对id进行分组,所有的“List”最终都会得到彼此独立的处理

预期产量应为:1,2,6,19,3,4,5,22 但是我得到:1,2,6,3,4,5,19,22

编辑 在某些情况下,我还对恢复所有“mySubClass”对象感兴趣。

因此,我们如何使用相同的排序条件返回“mySubClass”列表,而不是返回一个值数组?

您必须使用
SelectMany
,然后将属性存储在一个类型中,例如
ValueTuple
。然后就可以很容易地使用适当的
OrderBy
<代码>然后按:

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”列表。怎么 你会那样做吗


您必须使用
SelectMany
,然后将属性存储在类型中,例如
ValueTuple
。然后就可以很容易地使用适当的
OrderBy
<代码>然后按:

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”列表。怎么 你会那样做吗

我要做的是将所有值提取到一个数组中,并按“偏移量”值对它们进行排序

我认为您不需要只包含property
value
的值的整数数组。我认为您需要一系列:

int Id
int Offset
int Value
按偏移量的升序值排序。如果您不想在最终结果中使用
偏移量
,则始终可以使用额外的
选择
来消除它

您是对的,您可以使用Enumerable.SelectMany的一个重载来执行此操作。我几乎总是使用带有参数
resultSelector

IEnumerable<MyClass> items = ...
var result = items.SelectMany(item => item.SubClasses,

// parameter resultSelector, use the [Item, SubClass] combination to make one new
(item, subclass) => new
{
    Id = item.Id,
    Offset = item.Offset,
    Value = item.Value,
})
.OrderBy(item => item.Offset);
IEnumerable items=。。。
var result=items.SelectMany(item=>item.subclass,
//参数resultSelector,使用[Item,SubClass]组合创建一个新的
(项目,子类)=>新建
{
Id=项目Id,
偏移量=项目。偏移量,
值=项。值,
})
.OrderBy(项目=>项目偏移量);
我要做的是将所有值提取到一个数组中,并按“偏移量”值对它们进行排序

我认为您不需要只包含property
value
的值的整数数组。我认为您需要一系列:

int Id
int Offset
int Value
按偏移量的升序值排序。如果您不想在最终结果中使用
偏移量
,则始终可以使用额外的
选择
来消除它

您是对的,您可以使用Enumerable.SelectMany的一个重载来执行此操作。我几乎总是使用带有参数
resultSelector

IEnumerable<MyClass> items = ...
var result = items.SelectMany(item => item.SubClasses,

// parameter resultSelector, use the [Item, SubClass] combination to make one new
(item, subclass) => new
{
    Id = item.Id,
    Offset = item.Offset,
    Value = item.Value,
})
.OrderBy(item => item.Offset);
IEnumerable items=。。。
var result=items.SelectMany(item=>item.subclass,
//参数resultSelector,使用[Item,SubClass]组合创建一个新的
(项目,子类)=>新建
{
Id=项目Id,
偏移量=项目。偏移量,
值=项。值,
})
.OrderBy(项目=>项目偏移量);

谢谢,效果很好!我希望有一天能够理解Linq的魔力:-)如果您不返回有序值,而是希望返回基于相同排序标准的有序“mySubClass”列表,该怎么办。你会怎么做?谢谢,谢谢,它工作得很好!我希望有一天能够理解Linq的魔力:-)如果您不返回有序值,而是希望返回基于相同排序标准的有序“mySubClass”列表,该怎么办。你会怎么做?谢谢