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

C# 根据c中数据表中的年份日期分组#,c#,asp.net,linq,C#,Asp.net,Linq,我有这样一个数据表(付款月份列为日期) 我需要如下输出数据表(使用paymentmonth列中的年份分组) 在c中使用linq或compute获取输出数据表# 谢谢 普拉布先生你需要这样的东西: var result = datatable.AsEnumerable() .GroupBy(r => DateTime.Parse(r["PaymentMonth"].ToString()).Year) .S

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

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

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

谢谢
普拉布先生

你需要这样的东西:

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

我假设
PaymentMonth
是一个
DateTime
对象,
data
是保存数据的集合。

作为一个学习练习,我做了如下操作。我是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);
}

这里有什么问题?只有一个更改是.GroupBy(r=>DateTime.Parse(r[“PaymentMonth”].ToString()).Year)
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);
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);
}
Year    Amount

2014     500

2015     600

2016     200