我有一个像这样的DataTable:
我想将J = 340在一起的行加在一起,341在一起等等,直到J = 120为6年(2006年 - 2012年)。但去年的J值为340-365不应该是总和。
我首先使用这种方式将值与日期相加(不含linq): (年= 6)
for (int i = 1; i <= year; i++)
{
DataRow[] foundRow = dataTable.Select("Dates =" + temp.ToString());
aggregateValue += Convert.ToDouble(foundRow[0] ["Values"].ToString());
if (innerCounter % year == 0)
{
DataRow newRow = newDT.NewRow();
newRow["sum"] = aggregateValue / innerCounter;
newDT.Rows.Add(newRow);
aggregateValue = 0;
innerCounter = 0;
}
}
这个解决方案对我有好处,但对于29Feb&#39;,我(事实上我们的团队)决定使用J来总结相同的J值以涵盖&#34; 29Feb&#34;闰年。
谢谢,
答案 0 :(得分:1)
这是你需要的吗?
//find the max year
var lastRecord = table.AsEnumerable()
.OrderByDescending(f => f.Field<DateTime>("Dates")).First();
//if you want to filter by predefined year - change the value of lastYear
var lastYear = lastRecord.Field<DateTime>("Dates").Year;
var aggregates = table.AsEnumerable()
//grouping by J and Year to exclude uninterested records
.GroupBy(f => new
{
J = f.Field<int>("J"),
Year = f.Field<DateTime>("Dates").Year
})
//excluding records with unsatisfactory conditions
.Where(f => (f.J < 340 || f.J > 365) && f.Year != lastYear)
//combining remaining records into one sequence
.SelectMany(f => f)
.GroupBy(f => f.J)
.Select(f => new
{
J = f.Key,
SumValues = f.Sum(x => x.Field<double>("Values"));
});
结果序列将包含J
标记的和。
答案 1 :(得分:0)
您可以使用linq计算数据表中任何列的总和,如下所示:
table.AsEnumerable().Sum(x=>x.Field<int>("SomeProperty"));
在你的情况下,它将是这样的:
table.AsEnumerable().Where(x=>x.Field<int>("J") < 340 && x.Field<int>("J") > 365).Sum(x=>x.Field<int>("J"));
您可以根据需要修改条件。在上述条件下,它将不计算在340到365之间的J值