如何在此 DataTable 上按一列分组
Posted
技术标签:
【中文标题】如何在此 DataTable 上按一列分组【英文标题】:How do I GroupBy one column on this DataTable 【发布时间】:2021-10-14 15:46:54 【问题描述】:假设我有一个通话记录 DataTable,其中每一行代表一个通话,其中包含以下列: AccountNumber1、AccountNumber2、AccountListDate、AccountDisposition
我想要 GroupBy 列 AccountNumber1 并想要一个具有相同列 + 1 个附加列 NumCalls 的新 DataTable,这将是每个 AccountNumber1 的调用计数。
GroupBy 之后的新数据表: AccountNumber1、AccountNumber2、AccountListDate、AccountDisposition、NumCalls
到目前为止,我有以下内容:
table.AsEnumerable()
.GroupBy(x => x.Field<int>("AccountNumber1"))
.Select(x => new x.Key.AccountNumber1, NumCalls = x.Count() )
.CopyToDataTable()
这给了我一个只有两列 AccountNumber1 和 NumCalls 的 DataTable。如上所述,我如何获得其他列?我将不胜感激任何帮助。谢谢。
【问题讨论】:
您的代码无法编译,因为Select
重载不存在并且 CopyToDataTable
需要 IEnumerable<DataRow>
作为输入。
另外,如果您只按第一列分组,您想使用哪些行来获取其他列的值?
@TimSchmelter 我的错,当我输入示例代码时,我忘记了 Select() 中的新匿名类型声明
【参考方案1】:
没有魔法,您需要使用循环并使用新列初始化新表:
DataTable tblResult = table.Clone();
tblResult.Columns.Add("NumCalls", typeof(int));
var query = table.AsEnumerable().GroupBy(r => r.Field<string>("AccountNumber1"));
foreach (var group in query)
DataRow newRow = tblResult.Rows.Add();
DataRow firstOfGroup = group.First();
newRow.SetField<string>("AccountNumber1", group.Key);
newRow.SetField<string>("AccountNumber2", firstOfGroup.Field<string>("AccountNumber2"));
newRow.SetField<DateTime>("AccountListDate", firstOfGroup.Field<DateTime>("AccountListDate"));
newRow.SetField<string>("AccountDisposition", firstOfGroup.Field<string>("AccountDisposition"));
newRow.SetField<int>("NumCalls", group.Count());
这从每个组的第一行中获取任意值,这似乎是需要的。
【讨论】:
谢谢!我担心会是这样。希望在 .GroupBy() 之后有一些方法可以用 Linq 快速完成。 @JDSchenck:CopyToDataTable
总是创建一个与输入表(行)具有相同架构/列的新表。但你需要另一列。以上是关于如何在此 DataTable 上按一列分组的主要内容,如果未能解决你的问题,请参考以下文章