根据c#中数据表的年份分组

时间:2015-02-03 13:25:36

标签: c# asp.net linq

我有一个这样的数据表(付款月份列为日期)

PaymentMonth        Amount

01/01/2014           100

01/02/2014           200

01/03/2014           200

01/01/2015           300

01/02/2015           300

01/01/2016           200

我需要输出数据表如下(通过使用paymonth列中的年份分组)

Year    Amount

2014     500

2015     600

2016     200

使用linq获取输出数据表或在c#

中计算

由于 M. Prabhu

2 个答案:

答案 0 :(得分:3)

你需要这样的东西:

var result = datatable.AsEnumerable()
                      .GroupBy(r => DateTime.Parse(r["PaymentMonth"].ToString()).Year)
                      .Select(x=> new { Year = x.Key, 
                                        Amount = x.Sum(r=>Int32.Parse(r["Amount"])
                                      }
                     ).OrderBy(x=>x.Year);

我认为PaymentMonthDateTime个对象,data是保存数据的集合。

答案 1 :(得分:1)

作为一项学习练习,我已经完成了如下操作。我是LINQ的新手,所以不能保证这是否是最有效的方式,但它是有效的并且可以自我解释。

DataTable dt = new DataTable();
dt.Columns.Add("PaymentMonth", typeof(System.DateTime));
dt.Columns.Add("Amount", typeof(int));

dt.Rows.Add(new DateTime(2014, 1, 1), 100);
dt.Rows.Add(new DateTime(2014, 2, 1), 200);
dt.Rows.Add(new DateTime(2014, 3, 1), 200);
dt.Rows.Add(new DateTime(2015, 1, 1), 300);
dt.Rows.Add(new DateTime(2015, 2, 1), 300);
dt.Rows.Add(new DateTime(2016, 1, 1), 200);

var sumResult = from amt in dt.AsEnumerable()
                group amt by amt.Field<System.DateTime>("PaymentMonth").Year into agg
                select new { Year=agg.Key,SumAmount=agg.Sum(r=>r.Field<int>("Amount")) };

DataTable dtAgg = new DataTable();
dtAgg.Columns.Add("Year",typeof(int));
dtAgg.Columns.Add("Amount", typeof(int));

foreach(var item in sumResult)
{
   dtAgg.Rows.Add(item.Year, item.SumAmount);
}

DataTable dtAgg现在包含聚合数据,如下所示

Year    Amount

2014     500

2015     600

2016     200
相关问题