c# - 使用 Linq 修改 List<T> 以使用匹配的指示符平均行

我有一个 .csv 文件,其中每一行数据代表一个零件及其相关参数。例如名称、Y 位置等。我已经定义了一个类来表示每个部分,并且已经将 .csv 解析为 List<Part> parts

但是,CSV 文件包含具有相同名称的多行。我想减少 List<Part> parts 组合相同名称的行并平均 Y 位置。

输入:.csv

Name,XPosition,YPosition
A,10,1
B,10,4
C,10,3
C,10,5
D,12,6
D,12,8

我已经根据这些数据创建了 List<Part> parts

所需的输出: List<Parts> part 包含:

Part { Name="A", YPosition=1 },
Part { Name="B", YPosition=4 },
Part { Name="C", YPosition=4 },
Part { Name="D", YPosition=7 }

我试过了:

List<Part> parts = parts
.GroupBy(p => p.Name)
.Select(g => new Part()
{
    Name = g.Key, 
    YPosition = g.Average(p => p.YPosition)
}
foreach (Part g in parts)
{
    Console.WriteLine(g.Name + "," + g.XPosition + "," + g.YPosition);
}

但是 XPosition 不会传递给零件...

回答1

当您从零件中获取其他信息时,您似乎没有选择 XPosition。我在下面添加了一个 select 语句,以从 Part 中获取 XPosition 的第一个 value。我运行了这段代码并获得了所需的 XPosition。希望这可以解决您的问题。

List<Part> parts = parts
.GroupBy(p => p.Name)
.Select(g => new Part()
{
    Name = g.Key, 
    XPosition = g.Select(p => p.XPosition).FirstOrDefault(),
    YPosition = g.Average(p => p.YPosition)
}

相似文章

最新文章