要在 C# 中将一个 DataTable
按照指定的列进行聚合,并生成一个新的 DataTable
,你可以按照以下步骤实现。主要思路是使用 LINQ 来对数据进行分组,然后聚合得到需要的结果。
实现思路:
- 定义源 DataTable:即你现有的数据结构。
- 使用 LINQ 对数据进行分组:根据前三列(产线、机台、工序)和物料号进行分组。
- 生成新的 DataTable:将分组后的结果插入到新的
DataTable
中。
示例代码:
假设你的原始 DataTable
结构如下:
DataTable dt = new DataTable();
dt.Columns.Add("产线", typeof(string));
dt.Columns.Add("机台", typeof(int));
dt.Columns.Add("工序", typeof(int));
dt.Columns.Add("物料号", typeof(int));
dt.Columns.Add("物料描述", typeof(string));
dt.Columns.Add("图纸", typeof(string));
dt.Rows.Add("A", 2, 3, 4, "4描述", "4图纸");
dt.Rows.Add("A", 2, 3, 4, "4描述", "4图纸");
dt.Rows.Add("A", 2, 3, 4, "4描述", "4图纸");
dt.Rows.Add("A", 3, 3, 4, "4描述", "4图纸");
dt.Rows.Add("A", 3, 4, 4, "4描述", "4图纸");
dt.Rows.Add("B", 3, 4, 5, "5描述", "5图纸");
转换代码:
DataTable dttemp = new DataTable();
dttemp.Columns.Add("产线", typeof(string));
dttemp.Columns.Add("机台", typeof(int));
dttemp.Columns.Add("工序", typeof(int));
dttemp.Columns.Add("物料号", typeof(int));
dttemp.Columns.Add("物料描述", typeof(string));
dttemp.Columns.Add("图纸", typeof(string));
var groups = dt.AsEnumerable()
.GroupBy(row => new
{
产线 = row.Field<string>("产线"),
机台 = row.Field<int>("机台"),
工序 = row.Field<int>("工序"),
物料号 = row.Field<int>("物料号")
})
.Select(g => new
{
g.Key.产线,
g.Key.机台,
g.Key.工序,
g.Key.物料号,
物料描述 = g.First().Field<string>("物料描述"),
图纸 = g.First().Field<string>("图纸")
});
foreach (var group in groups)
{
dttemp.Rows.Add(group.产线, group.机台, group.工序, group.物料号, group.物料描述, group.图纸);
}
foreach (DataRow row in dttemp.Rows)
{
Console.WriteLine($"{row["产线"]}, {row["机台"]}, {row["工序"]}, {row["物料号"]}, {row["物料描述"]}, {row["图纸"]}");
}
代码解释:
**定义源 DataTable
(dt
) 和目标 DataTable
(dttemp
)**:
dt
是原始数据表,包含重复的数据。dttemp
是聚合后的新数据表。
LINQ 查询:
- 使用
AsEnumerable()
将 DataTable
转换为可查询的 IEnumerable<DataRow>
。 - 使用
GroupBy
根据前三列(产线、机台、工序)和物料号进行分组。 Select
中通过 g.First()
获取物料描述和图纸,因为相同物料号的这些字段数据是一样的。
**将结果添加到新的 DataTable
**:
- 遍历分组后的结果,并将每一组的数据添加到
dttemp
中。
验证输出:
- 最后通过
foreach
输出新 DataTable
的内容,以验证结果。
输出结果:
根据你的示例数据,输出的 DataTable
(dttemp
) 应该是这样的:
产线, 机台, 工序, 物料号, 物料描述, 图纸
A, 2, 3, 4, 4描述, 4图纸
A, 3, 3, 4, 4描述, 4图纸
A, 3, 4, 4, 4描述, 4图纸
B, 3, 4, 5, 5描述, 5图纸
总结
通过使用 LINQ 对 DataTable
进行分组和聚合,可以很方便地将原始数据表按照指定规则聚合为新的数据表。此方法的核心在于 LINQ 的 GroupBy
和 Select
操作,确保分组后的数据按照期望的方式被处理和插入到新表中。
希望这个解决方案能够帮助您解决问题。