【问题标题】:How do I use Linq to group a DataTable by multiple rows/columns into a new datatable with duplicate rows concatenated?如何使用 Linq 将数据表按多行/列分组到一个新的数据表中,并连接重复的行?
【发布时间】:2010-02-18 23:52:59
【问题描述】:

上帝,Linq 让我感到困惑……我找到了很多与我需要类似的事情的例子,但我仍然得到了转机。我有一个看起来像这样的表(我们称之为 UngroupedTable)......

ID、Val1、Val2
0001, A, 1
0001, B, 2
0002, C, 3
0003, D, 4
0003, D, 5

我想使用 Linq 构建一个表,其中基本上在 GroupedTable 中,ID 将变得唯一,并且重复 ID 的值将连接到它们各自的行中。

所以,它看起来像这样......

ID、Val1、Val2
0001, A B, 1 2
0002, C, 3
0003, D, 4 5

我们称之为 GroupedTable。

我得到的肯定不是很接近,但我还是会发布它......

from row in passedInTable.AsEnumerable()
group row by new { ID = row.Field<string>("ID"), Val1 = row.Field<string>("Val1"), Val2 = row.Field<string>("Val2") } into groupedRow
select new
{
    ID = groupedRow.Key.ID,
    Val1 = groupedRow.Key.Val1,
    Val2 = groupedRow.Key.Val2
};

我想我现在可以通过一些 for 循环来完成我需要做的事情,但我很确定它可以通过 Linq 实现。特别是基于我看到的所有示例,使用 .sum() 表示数字类型。

编辑
我想最终的问题是,在上面的查询中,我如何从该选择新块中聚合 val1 和 val2 列的值,以便选择连接的值。

【问题讨论】:

    标签: linq datatable group-by


    【解决方案1】:

    您只需要按行的 ID 进行分组。然后,连接每个组中的所有值:

    from row in passedInTable.AsEnumerable()
    group row by row.Field<string>("ID") into rowGroup
    select new
    {
        ID = rowGroup.Key,
        Val1 = String.Join(" ", rowGroup.Select(row => row.Field<string>("Val1")).ToArray()),
        Val2 = String.Join(" ", rowGroup.Select(row => row.Field<string>("Val2")).ToArray()),
    };
    

    【讨论】:

    • 非常酷。分组是关键,而且我试图使用 Linq 的聚合方法,这显然不是必需的。谢谢先生!
    • 聚合可以在这里工作,String.Join 恰好是我们可以利用的特定实现:-)
    • 是的,这就是我收集到的。可能会尝试汇总它,看看我是否可以。
    • 需要从一个对象列表转换为一个复杂对象,该对象表示一个包含详细信息列表的分组。我能够使用您的答案来弄清楚我需要什么。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2012-09-22
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多