合并List< PartialColumn>& lt; List< Column>使用LINQ

本文关键字:List Column 使用 LINQ PartialColumn 合并 lt | 更新日期: 2023-09-27 18:01:24

我想使用LINQList<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属性值将被添加到合并后的ColumnList<string> ListOfSections属性中。

PartialColumnStartElevation属性的最小值将被设置为最终合并的ColumnStartElevation属性。

PartialColumnEndElevation属性的最大值将被设置为最终合并的ColumnEndElevation属性。

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);
}

合并List< PartialColumn>& lt; List< Column>使用LINQ

你离得不远了…

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()
};
相关文章: