按DateTime分组数据表中的DateTime行 - C#

Far*_*day 4 c# linq datatable datetime group-by

我有一个大的数据表(500k-1m行),没有详细说明这是一个要求,因为最终用户需要/希望能够看到所有数据.这是在本地服务器上,所以带宽等对我来说不是问题.

我在DataTable中有一个DateTime字段,我需要对其进行分组,让我通过分组来解释我的意思......这可能不是你的想法(通过查看这里的其他问题!).

        var table = new DataTable();
        table.Columns.Add("EventTime", typeof(DateTime));
        table.Columns.Add("Result", typeof(String));
        table.Columns.Add("ValueOne", typeof(Int32));
        table.Columns.Add("ValueTwo", typeof(Int32));
        table.Rows.Add("2012-02-06 12:41:45.190", "A", "7", "0");
        table.Rows.Add("2012-02-06 12:45:41.190", "B", "3", "89");
        table.Rows.Add("2012-02-06 12:59:41.190", "C", "1", "0");
        table.Rows.Add("2012-02-06 13:41:41.190", "D", "0", "28");
        table.Rows.Add("2012-02-06 17:41:41.190", "E", "0", "37");
        table.Rows.Add("2012-02-07 12:41:45.190", "F", "48", "23");
Run Code Online (Sandbox Code Playgroud)

我希望将上面的表分组,以便得到"ValueOne"列的总和,以及"ValueTwo"列的平均值.我需要分组有点灵活,以便我可以指定我想要按分钟分组(只有第一行和最后一行会被分组,其余行只提供它们的值),或者按天(除了最后一行之外的所有行)将被分组为单行)等.

我已经尝试了几次,但我没有在哪里.我的LINQ知识不是很好,但我想我能做到这一点!

注意:DataTable已经在机器上用于无法更改的计算/视图,因此说"停止成为白痴,在SQL中过滤!!!" 是一个有效的答案,对我来说没用!:-D

另外,如果你在标题中错过了它,我需要在C#中使用它 - 我正在使用.NET 4.0 ...

提前谢谢,假设您决定提供帮助!:-)

Dav*_*son 5

其他三个答案很接近,但正如你所指出的那样,他们将事件分组发生在同一秒钟内,而不是同一秒内发生的事件,这就是你想要的.试试这个:

var query = from r in table.Rows.Cast<DataRow>()
        let eventTime = (DateTime)r[0]
        group r by new DateTime(eventTime.Year, eventTime.Month, eventTime.Day, eventTime.Hour, eventTime.Minute, eventTime.Second)
            into g
        select new {
                g.Key,
                Sum = g.Sum(r => (int)r[2]),
                Average = g.Average(r => (int)r[3])
            };
Run Code Online (Sandbox Code Playgroud)

您可以调整传递给DateTime构造函数的信息,以便按不同的时间部分进行分组.

  • 我没有注意的错.我混合了方法语法和理解语法.我再次更新,并检查它编译这次. (2认同)