如何解决如何订购匿名类型组内的项目?
我想以匿名对象组的形式获得 Linq 查询的结果。组内的项目应按 ID
字段排序。我可以通过 lambda 语法部分达到这一点,但结果无法获得匿名对象。所以我需要每个例子的一部分。
可执行代码:https://dotnetfiddle.net/cPJUN9
var res_g = (from dg in list
group new { dg.ID,dg.IDOperation,dg.IDDiagnosis } by dg.IDOperation
into dg_group
select dg_group);
lambda 语法
var res_g = list
.GroupBy(x => x.IDOperation)
.Select(x => x.OrderBy(x => x.ID)); // order dg by ID asc within group
解决方法
您可以更新 GetDict 函数内循环以在组元素上使用 orderby
public static void GetDict(List<Operation> list)
{
var res_g = (from dg in list
group new { dg.ID,dg.IDOperation,dg.IDDiagnosis } by dg.IDOperation
into dg_group
select dg_group);
foreach (var x in res_g)
{
Console.WriteLine("Key: " + x.Key);
foreach (var y in x.OrderBy(o=>o.ID))
{
Console.WriteLine("{0} {1} {2}",y.ID,y.IDOperation,y.IDDiagnosis); ;
}
}
}
我希望这能解决问题。
根据您的要求编辑,但我正在调整结果集
var res_g_2 = list.Select( p=> new { p.ID,p.IDOperation,p.IDDiagnosis }) .GroupBy(g => g.IDOperation)
.Select(g => new {
IDOperation = g.Key,Records = g.OrderBy(group => group.ID)
});
编辑完整版
public static void GetDict(List<Operation> list)
{
var res_g = (from dg in list
group new { dg.ID,dg.IDDiagnosis } by dg.IDOperation
into dg_group
select new
{
Key = dg_group.Key,Records = dg_group.OrderBy(g => g.ID)
}) ;
var res_g_2 = list.Select( p=> new { p.ID,p.IDDiagnosis }) .GroupBy(g => g.IDOperation)
.Select(g => new {
Key = g.Key,Records = g.OrderBy(group => group.ID)
});
// you can use either res_g or res_g_2 both give the same results
foreach (var x in res_g)
{
Console.WriteLine("Key: " + x.Key);
foreach (var y in x.Records)
{
Console.WriteLine("{0} {1} {2}",y.IDDiagnosis); ;
}
}
}
,
唉,你没有准确地描述你的需求在哪里,只是你想要一些匿名类型并且它们应该按 Id 排序。您的查询语法与您的方法语法构成不同的组。所以我只能举个例子来创建你的匿名对象序列
所以你有一系列相似的项目,其中每个项目至少有属性 Id 和 IdOperation。您希望将项目分组,其中每个组中的每个项目都具有相同的 IdOperation 值。您想按 Id 升序对每个组中的元素进行排序,并创建一些匿名类型。
你没有在你的匿名对象中指定你想要什么(毕竟:你的代码没有做你想要的,所以我不能从你的代码中扣除)
每当我使用 GroupBy,并且我想指定每个组的元素时,我都会使用 overload of GroupBy that has a parameter resultSelector。使用 resultSelector 我可以精确地定义组的元素。 (链接指的是IQueryable,还有一个IEnumerable version)
IEnumerable<Operations> operations = ... // = your list
// Make Groups of Operations that have the same value for IdOperation
var result = operations.GroupBy(operation => operation.IdOperation,// parameter resultSelector: take the key (=idOperation) and all Operations that have
// this idOperation,to make one new.
(idOperation,operationsWithThisId) => new
{
// do you need the common idOperation?
IdOperation = idOperation,// Order the elements in each group by Id:
Operations = operationsWithThisId.OrderBy(operation => operation.Id)
.Select(operation => new
{
// Select only the operation properties that you plan to use
Id = operation.Id,Name = operation.Name,StartDate = operation.StartDate,...
})
.ToList(),});
换句话说:从您的操作序列中,创建具有相同 IdOperation 值的操作组。然后用这个通用的 IdOperation 和这个组中的所有操作来创建一个匿名对象:这就是你所说的匿名对象。所以每组,你制作一个匿名对象。
- IdOperation 是该组中所有操作的共同值
- 操作是一个列表。该组中的所有操作均按 Id 升序排列。几个属性被选中,结果被放在一个列表中。
如果你想以不同的方式分组,就像在你的查询语法中一样,只需更改参数 keySelector:
var result = operations.GroupBy(operation => new
{
Id = operation.ID,IdOperation = operation.IDOperation,IdDiagnosis = operation.IDDiagnosis
},
尽管这与您在查询语法中所做的一致,但您将拥有具有相同 Id / IdOperation / IDDiagnosis 值的操作组。将组中的元素按 Id 排序是没有用的,因为该组中的所有 Id 都是相等的。
结论
使用参数 resultSelector,您可以完全按照自己的意愿定义结果:结果不是 IEnumerable<IGrouping<Tkey,TElement>>
,而是 IEnumerable<TResult>
。
TResult 是从一组中的所有元素和公共组值创建的一个对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。