【问题标题】:C# DataTable - GroupBy then OrderByC# DataTable - GroupBy 然后 OrderBy
【发布时间】:2013-09-30 21:28:42
【问题描述】:

我有一个包含 5 列的 DataTable。

活动(字符串) 打卡(日期时间) 打卡(日期时间) 总计(双) 类型(整数)

我需要按出勤 DateTime.Date 和 OrderBy 类型分组。

所以本质上,如果我有数据,我希望它像这样分组/排序:

Activity    Clock In           Clock Out          Total    Type

Drawing     09/16/13 13:30     09/16/13 13:32     0.02     1
Drawing     09/16/13 13:40     09/16/13 13:42     0.02     1
Testing     09/16/13 13:50     09/16/13 13:52     0.02     1
Testing     09/16/13 13:30     09/16/13 13:34     0.04     2
Testing     09/16/13 13:40     09/16/13 13:54     0.14     2


Drawing     09/17/13 13:50     09/17/13 13:52     0.02     1
Testing     09/17/13 13:30     09/17/13 13:34     0.04     2
Testing     09/17/13 13:40     09/17/13 13:54     0.14     2


Testing     09/18/13 13:52     09/18/13 13:54     0.02     2

我已经在 DataTable 中拥有所有数据,我只需要分组方面的帮助...

有什么想法吗??我试过了:

groupedSortedTbl = dt.AsEnumerable()
                    .GroupBy(d => d.Field<DateTime>("CLOCK_OUT").Date)
                    .SelectMany(g => g.OrderBy(t => t.Field<int>("Type")))
                    .CopyToDataTable();

【问题讨论】:

  • 您要按Clock Out 分组吗?如果是这样,你为什么要在之后使用SelectMany 来平整它们?你可以改用OrderBy+ThenBy
  • SelectMany 正在有效地摆脱分组。您想要一个结果集还是一组组?

标签: c# sorting datatable


【解决方案1】:

我认为你想这样做......

groupedSortedTbl = dt.AsEnumerable()
                    .OrderBy(d => d.Field<DateTime>("CLOCK_OUT").Date)
                    .ThenBy(t => t.Field<int>("Type"))
                    .CopyToDataTable();

【讨论】:

    【解决方案2】:

    您想按Clock Out 分组吗?如果是这样,你为什么要在之后使用SelectMany 将它们展平?你可以改用OrderBy + ThenBy

    DataTable groupedSortedTbl = dt.AsEnumerable()
        .OrderBy(row => row.Field<DateTime>("CLOCK_OUT").Date)
        .ThenBy(row  => row.Field<int>("Type"))
        .CopyToDataTable();
    

    如果要保留组,则不能在末尾使用CopyToDataTable 来创建DataTable。所以你可以创建一个IEnumerable&lt;Anonymous/Custom Type&gt;。或者您可以选择多个DataTables,每个日期组一个:

    IEnumerable<DataTable> dateGroups = dt.AsEnumerable()
        .GroupBy(row => row.Field<DateTime>("CLOCK_OUT").Date)
        .Select(g => g.OrderBy(t => t.Field<int>("Type")).CopyToDataTable());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多