c# - 使用 Linq 重新排列嵌套列表

标签 c# linq list nested

我目前正在开发一个项目,我从电子表格中读取行数据。基础数据的结构可以在左侧的附图中看到。也可以看出我想分两步重新排列数据。

Image1: Steps to sort the list

  • 首先,我将具有相同 PartName 的元素组合在一起,并将两个坐标对组合在一行上。我将坐标存储在嵌套列表中。
  • 其次,我想组合具有相同 ID 的元素,并再次组合坐标。重要的是列表保持其顺序并且最终不存在重复项。像这样的:{x1y1,x2y2}{x2y2,x3y3}=>{x1y1,x2y2,x3y3}

元素部分的数量是通用的,因此坐标对的数量也是通用的。

这是我当前正在使用的简化对象类:

public class ElmLine
{
    public int Id{ get; set; }
    public string PartName {get; set;}
    public List<CoordList> CoordList { get; set; }
}

public class CoordList
{
    public decimal XCord { get; set; }
    public decimal YCord { get; set; }
}

这是我的第 1 步方法。我重新排列了基本列表,并将协调对存储在名为 CoordList 的嵌套列表中。

public void BuildLinesFormSegments(IList<ElmLine> filteredLine)
    {
        // Merge line parts and add FROM and TO to each line part 
        var combinedLineParts = filteredLine
            .GroupBy(c => new { c.Fid, c.FidPart }).Select(g => new ElmLine()
            {
                Id = g.Select(c => c.Id).First(),
                PartName = g.Select(c => c.PartName).First(),
                CoordList = g.Select(c => new CoordList() 
                            { XCord = c.CoordX, YCord = c.CoordY }).ToList(),
            }).ToList();
    }

结果列表combinedLineParts如下所示:

var list = new LineParts<ElmLine>
{
    new ElmLine {Name = 1, CoordList = new List<CoordList>
        {new CoordList {XCord = x1, YCord = y1}, new CoordList { XCord = x2, YCord = y2 }} },
    new ElmLine {Name = 1, CoordList = new List<CoordList>
        {new CoordList {XCord = x2, YCord = y2}, new CoordList { XCord = x3, YCord = y3 }} },
    new ElmLine {Name = 2, CoordList = new List<CoordList>
        {new CoordList {XCord = x11, YCord = y11}, new CoordList { XCord = x12, YCord = y12 }} },
    new ElmLine {Name = 2, CoordList = new List<CoordList>
        {new CoordList {XCord = x12, YCord = y12}, new CoordList { XCord = x13, YCord = y13 }} },
};

不幸的是我被困在这一点上并且我不知道继续第2步。如果有人能给我提示我下一步可以做什么,那就太好了。

提前谢谢您。

最佳答案

第 3 步确实不需要依赖第 2 步。您只需按 ID 分组并保留不同的坐标值即可:

var result = filteredLine
        .GroupBy(c => c.Fid)
        .Select(g => new ElmLine()
        {
            Id = g.Key,
            CoordList = g
                .Select(c => { c.CoordX, c.CoordY })
                .Distinct()
                .Select(c => new CoordList() 
                        { XCord = c.CoordX, YCord = c.CoordY })
                .ToList(),
        }).ToList();

关于c# - 使用 Linq 重新排列嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40157925/

相关文章:

c# - Linq groupby 和 sum

python - 检索所有 x 坐标的优雅方式

c# - Datagrid列可以在不同的行中包含不同类型的控件吗

c# - 用于匹配特定表达式的正则表达式

c# - 自安装内存缓存 - 它存在吗?

c - 双链表中交换节点时出现问题

list - 口齿不清。创建对列表

c# - 如何对 'Type' 进行 XML 序列化

c# - LINQ:具有多个条件的左外连接

c# - 使用 foreach 从 List 中过滤对象