【问题标题】:How do I GroupBy one column on this DataTable如何在此 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&lt;DataRow&gt; 作为输入。
  • 另外,如果您只按第一列分组,您想使用哪些行来获取其他列的值?
  • @TimSchmelter 我的错,当我输入示例代码时,我忘记了 Select() 中的新匿名类型声明

标签: c# linq datatable


【解决方案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 总是创建一个与输入表(行)具有相同架构/列的新表。但你需要另一列。
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2023-02-17
相关资源
最近更新 更多