C# 根据c中数据表中的年份日期分组#
我有这样一个数据表(付款月份列为日期) 我需要如下输出数据表(使用paymentmonth列中的年份分组) 在c中使用linq或compute获取输出数据表# 谢谢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
普拉布先生你需要这样的东西:
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