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因此,我们如何使用相同的排序条件返回“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(项目=>项目偏移量);
我要做的是将所有值提取到一个数组中,并按“偏移量”值对它们进行排序
我认为您不需要只包含propertyvalue
的值的整数数组。我认为您需要一系列:
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”列表,该怎么办。你会怎么做?谢谢