c# - 为 daterange 切片数据表,总结计数并创建自定义表?

标签 c# .net linq datatable

有什么简单的方法可以将数据表切片为一个范围并对一个范围的计数求和吗?

假设我有以下数据表

Date    Count
5/9/2016    5
5/10/2016   1
5/11/2016   2
5/12/2016   4
5/13/2016   3
5/14/2016   2
5/15/2016   1
5/16/2016   4

如果我将它切成 2 份,那么它将合并 2 行......类似

DateRange           Count
5/9/2016-5/10/2016  6
5/11/2016-5/12/2016 6
5/13/2016-5/14/2016 5
5/15/2016-5/16/2016 5

如果我将它切成 3 份,那么它会分成 3 行......类似

DateRange           Count
5/9/2016-5/11/2016  8
5/12/2016-5/14/2016 9
5/15/2016-5/16/2016 5

我试图在 asp:Chart (StackedColumn) 图表中显示日期范围内的数据。日期范围在 7、15、30、60、90、150、365 天之间变化。几乎每天都有一些数据条目,并且还有一个自定义日期控件来选择日期。假设用户选择 200 天的日期范围,200 天他们将有 200 条记录。现在有什么方法可以合并数据并显示在该图表中。目前我正在尝试按月进行,但据我所知有一个自定义日期范围,所以我需要想出一个不同的解决方法,任何帮助.

 public DataTable GetTable()
    {
        // Here we create a DataTable with four columns.
        DataTable table = new DataTable();

        table.Columns.Add("Date", typeof(DateTime));
        table.Columns.Add("R", typeof(int));
        table.Columns.Add("C", typeof(int));

        // Here we add five DataRows.
        for (int i = 0; i <= dayschunk; i++)
        {
            table.Rows.Add(DateTime.Now.Date.AddDays(-i).ToString("MMM-dd"), new Random().Next(0, 99), new Random().Next(0, 99));
        }
        var results = from row in table.AsEnumerable()
                      group row by new { Date = row.Field<DateTime>("Date").Month } into rowgroup
                      select new
                      {
                          rowgroup.Key.Date,
                          Remidiated = rowgroup.Sum(r => r.Field<int>("R")),
                          Stucked = rowgroup.Sum(r => r.Field<int>("C"))
                      };
        DataTable filtered = new DataTable();
        filtered.Columns.Add("DateRange", typeof(int));
        filtered.Columns.Add("R", typeof(int));
        filtered.Columns.Add("C", typeof(int));
        foreach (var item in results)
        {
            table.Rows.Add(CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(item.Date), item.Remidiated, item.Stucked);
        }

        //table.Rows.Add(2,new DateTime(2016, 05, 02), 50, 50);
        //table.Rows.Add(2,new DateTime(2016, 05, 07), 3, 4);
        //table.Rows.Add(2,new DateTime(2016, 05, 05), 16, 10);
        return filtered;
    }

最佳答案

您可以使用 Select 重载来传递索引并创建具有给定大小的 block 来执行此操作。

DataTable result = new DataTable();
result.Columns.Add("DateRange", typeof(string));
result.Columns.Add("Count", typeof(int));


int chunk = 2;  
        
result = table.AsEnumerable()
    .Select((row,i) => new {gid= i/chunk, row}) 
    .GroupBy(x=>x.gid)
    .Select(x=>  
            {
                var row= result.NewRow();
            
                row["DateRange"] = string.Format("{0}-{1}", x.First().row.Field<DateTime>("Date"), x.Last().row.Field<DateTime>("Date"));
                row["Count"]=  x.Sum(r=>r.row.Field<int>("R"));
                return row;
            }).CopyToDataTable<DataRow>();

检查这个Example

注意:我没有应用输出格式,但你可以轻松做到这一点,我会把它留给你。

关于c# - 为 daterange 切片数据表,总结计数并创建自定义表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37128429/

相关文章:

c# - System.Collections.IEnumerable 的 LINQ

c# - Azure函数通过clientRetryOptions和host.json进行队列绑定(bind)重试不起作用

c# - 使用调度程序仅运行一次代码

c# - 工作单元模式中的 EF Core 封装

c# - 将文件路径传递给 Main(string[] args) 不起作用

c# - 映射到嵌套类

javascript - 获取 .js 文件中的 .aspx 控件 ID

c# - 如何使用 dotnet sln 将所有项目添加到单个解决方案?

c# - 使用 Linq 优化 WMI 查询

linq - LINQ 中的 OrderBy 如何工作(在幕后)?