使用linq汇总行

时间:2016-12-21 08:16:27

标签: c# linq sum

我有一个像这样的DataTable:

enter image description here

我想将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;闰年。

谢谢,

2 个答案:

答案 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值