C#DataTable - GroupBy然后是OrderBy

时间:2013-09-30 21:28:43

标签: c# sorting datatable

我有一个包含5列的DataTable。

活动(字符串) 时钟输入(日期时间) 时钟输出(日期时间) 总计(双倍) 输入(int)

我需要GroupBy Clock Out DateTime.Date并在该OrderBy中输入Type。

基本上,如果我有数据,我希望它分组/顺序如下:

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();

2 个答案:

答案 0 :(得分:2)

我想你想这样做......

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

答案 1 :(得分:0)

您想按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<Anonymous/Custom Type>。或者您可以选择多个DataTables,每个日期组一个:

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