gpt4 book ai didi

c# - DataTable linq查询按列分组

转载 作者:太空宇宙 更新时间:2023-11-03 21:40:01 24 4
gpt4 key购买 nike

我使用 C# 开发了一个 Windows 应用程序。使用 DataTable 列出所有信息。该数据表具有重复值。

我的结果:

Lead Owners             <2Days  <5Days  <10Days <20Days >20Days Grand-Total
Dan Mahoney 1
Richard James Whitaker 1
Richard James Whitaker 1
Richard James Whitaker 1
Richard James Whitaker 1
Wayne Dunne 1
Wayne Dunne 1
Richard James Whitaker 1
Wayne Dunne 1
Richard James Whitaker 1
Richard James Whitaker 1

预期结果:

Lead Owners             <2Days  <5Days  <10Days <20Days >20Days Grand-Total
Dan Mahoney 1
Richard James Whitaker 7
Wayne Dunne 3

我需要一个 linq 查询来实现预期的结果。

请帮助我得到这个。提前致谢。

最佳答案

如果您想创建一个包含聚合值的新 DataTable,LINQ 并不是完成整个任务的最佳工具。您应该使用 DataTable.Clone 创建一个具有相同架构的空表。

然后可以在源表的键列上使用 Enumerable.GroupBy。最后使用循环添加具有聚合值的 DataRow:

var ownerGroups = dt.AsEnumerable()
.GroupBy(row => row.Field<string>("Lead Owners"));
var dt2 = dt.Clone();
var intColumns = dt2.Columns.Cast<DataColumn>()
.Where(c => c.DataType == typeof(int)).ToArray();
foreach (var grp in ownerGroups)
{
var row = dt2.Rows.Add();
row.SetField("Lead Owners", grp.Key);
foreach (DataColumn col in intColumns)
{
bool anyNonNull = grp.Any(r => r.Field<int?>(col.Ordinal).HasValue);
int? sum = anyNonNull ? grp.Sum(r => r.Field<int?>(col.Ordinal)) : null;
row.SetField(col, sum);
}
}

我假设数字列的类型是int

结果表:

Dan Mahoney                 null        null       1
Richard James Whitaker null 7 null
Wayne Dunne 3 null null

关于c# - DataTable linq查询按列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19834954/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com