列表中的项目组基于使用LINQ两个属性 [英] Group items in a list based on two properties using LINQ
本文介绍了列表中的项目组基于使用LINQ两个属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有如下一个列
类:
public class Column
{
public int LocId { get; set; }
public int SecId { get; set; }
public double StartElevation { get; set; }
public double EndElevation { get; set; }
}
和列$ C列表$ C>对象:
List<Column> Columns = new List<Column>();
例如:
Columns:
{
Column1: { LocId = 1 , SecId = 1, StartElevation = 0, EndElevation = 160 }
Column2: { LocId = 1 , SecId = 1, StartElevation = 160, EndElevation = 320 }
Column3: { LocId = 1 , SecId = 2, StartElevation = 320, EndElevation = 640 }
Column4: { LocId = 2 , SecId = 1, StartElevation = 0, EndElevation = 160 }
Column5: { LocId = 2 , SecId = 2, StartElevation = 160, EndElevation = 320 }
}
我想用的LINQ 。
通过列
列表,并转到:
-
的(A)选择具有相同
LOCID
。的
的(b),然后从列表中选择具有相同项目的另一个列表 SecId
。
这会给我希望清单,我将它执行其他的事情。
This will give me a list hopefully which I will perform other things on it.
因此应用上的数据,上述算法上面会是这样。
So applying the above algorithm on the data above will be like this.
Columns List
---------------------------------------------------------
| Column1 Column2 Column3 Column4 Column5 |
---------------------------------------------------------
|
|
(A)
|
|
--------------------------------------------
| |
GroupBasedOnLocId GroupBasedOnLocId
| |
----------- -----------
| Column1 | | Column4 |
| Column2 | | Column5 |
| Column3 | -----------
----------- |
| |
(B) (B)
| |
------------------------- -------------------------
| | | |
| | | |
GroupBasedOnSecId GroupBasedOnSecId GroupBasedOnSecId GroupBasedOnSecId
| | | |
| | | |
Column1 Column3 Column4 Column5
Column2
我怎样才能做到这一点使用LINQ?
How can I accomplish this using Linq?
PS是的,我已经把大量的时间到创建上面的图来传达这个问题越好。
P.S. Yes, I've put lots of time into creating the above diagram to convey the question better.
推荐答案
使用<$ C $ 。C> .GroupBy 复合键
示例代码:
List<Column> Columns = new List<Column>
{
new Column { LocId = 1 , SecId = 1, StartElevation = 0, EndElevation = 160 },
new Column { LocId = 1 , SecId = 1, StartElevation = 160, EndElevation = 320 },
new Column { LocId = 1 , SecId = 2, StartElevation = 320, EndElevation = 640 },
new Column { LocId = 2 , SecId = 1, StartElevation = 0, EndElevation = 160 },
new Column { LocId = 2 , SecId = 2, StartElevation = 160, EndElevation = 320 }
};
foreach (var group in Columns.GroupBy(c => new { c.LocId, c.SecId }))
{
Console.WriteLine("group: LocId = {0}, SecId = {1}", group.Key.LocId, group.Key.SecId);
foreach(Column column in group)
Console.WriteLine(" item: StartElevation = {0}, EndElevation = {1}", column.StartElevation, column.EndElevation);
}
您可以将集团任何你想要的方式:
You can transform the group any way you want:
foreach (var res in Columns.GroupBy(c => new { c.LocId, c.SecId })
.Select(g => new
{
g.Key.LocId,
g.Key.SecId,
MinStartElevation = g.Min(c => c.StartElevation),
MaxEndElevation = g.Max(c => c.EndElevation)
}))
{
Console.WriteLine("LocId = {0}, SecId = {1}, MinStartElevation = {2}, MaxEndElevation = {3}",
res.LocId, res.SecId, res.MinStartElevation, res.MinStartElevation);
}
这篇关于列表中的项目组基于使用LINQ两个属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文