合并List< PartialColumn>& lt; List< Column>使用LINQ
本文关键字:List Column 使用 LINQ PartialColumn 合并 lt | 更新日期: 2023-09-27 18:01:24
我想使用LINQ将List<PartialColumn> PartialColumns
合并到List<Column> Columns
。
public class PartialColumn
{
public double StartElevation { get; set; }
public double EndElevation { get; set; }
public int ColId { get; set; }
public string Section { get; set; }
}
PartialColumns:
ColId StartElevation EndElevation Section
-------------------------------------------------------
1 0 300 COL1
2 0 600 COL1
1 300 600 COL2
我想将具有相同ColId
的对象合并为Column
对象,并将它们添加到List<Column> Columns
中。
每个PartialColumn
对象的Section
属性值将被添加到合并后的Column
的List<string> ListOfSections
属性中。
PartialColumn
的StartElevation
属性的最小值将被设置为最终合并的Column
的StartElevation
属性。
PartialColumn
的EndElevation
属性的最大值将被设置为最终合并的Column
的EndElevation
属性。
public class Column
{
public int Id { get; set; }
public double StartElevation { get; set; }
public double EndElevation { get; set; }
public List<string> ListOfSections { get; set; }
}
列:
Id StartElevation EndElevation ListOfPartialColumns
-----------------------------------------------------------------
1 0 600 {COL1, COL2}
2 0 600 {COL1}
这是我到目前为止所做的。似乎我在添加Section
部分时遇到了问题。
foreach (var res in PartialColumns.GroupBy(c => new { c.ColId})
.Select(g => new
{
g.Key.ColId,
MinStartElevation = g.Min(c => c.StartElevation),
MaxEndElevation = g.Max(c => c.EndElevation),
}))
{
var column = new Column
{
StartElevation = res.MinStartElevation,
EndElevation = res.MaxEndElevation,
Id = res.ColId
};
Columns.Add(column);
}
你离得不远了…
var newColumns = PartialColumns.GroupBy(x=>x.ColId)
.Select(x=>new Column(){
StartElevation = x.Min(col=>col.StartElevation),
EndElevation = x.Max(col=>col.EndElevation),
Id = x.Key,
ListOfSections = x.Select(col=>col.Section).ToList()
}).ToList()
上面的以同样的方式执行group by。我没有使用匿名对象,而是把它作为一个linq语句来完成。
关键是我刚刚使用select从分组的partialColumns中筛选的部分,以在新列表中获得部分。
这已经进入一个新的列表,你可以很容易地将它添加到另一个列表中,连接它或做任何你想做的事情。
注意:代码是直接写在这里的,所以可能有拼写错误,但通常应该是好的。
from p in partialColumns
group p by p.ColId into grp
select new Column
{
Id = grp.Key,
StartElevation = grp.Min(x => x.StartElevation),
EndElevation = grp.Max(x => x.EndElevation),
ListOfSections = grp.Select(x => x.Section).ToList()
};