使用LINQ计算每小时燃油消耗量

时间:2013-10-10 11:23:47

标签: c# linq

我有一张datetime和值表。该值是日期时间的坦克容积。我想计算过去10天内每小时装满/倒空的油箱数量。

我每15分钟测量一次坦克,但也许我将来会每20分钟测量一次。我试图用LINQ计算它。

我做的是:

allDataView.RowFilter = String.Format(CultureInfo.InvariantCulture.DateTimeFormat,
    "DateOfData < #{0}# AND DateOfData > #{1}#", DateTime.Now, DateTime.Now.AddDays((-1) * daysInterval));

allDataView.Sort = "DateOfData DESC";

// making the diff between every sample during the last daysInterval days and put it into a list with these differences.
var result = allDataView.Table.AsEnumerable().Zip(allDataView.Table.AsEnumerable().Skip(1), (row1, row2) => Convert.ToDouble(row1["Value"])-Convert.ToDouble(row2["Value"]));

但这些是每次测量之间的差异。我想要的是在那几天的周期中计算样本之间的差异。

例如:

9:50   0.5
10:05  1
10:20  2
10:35  2.5
10:50  3
11:05  5

比我想要获取11:00(3)中的最新值并取10:00(0.5)中的最后一个值并将其3-0.5 = 2.5插入列表并继续时间段。

我想用Linq来做。感谢任何帮助如何实现它。

非常感谢。

2 个答案:

答案 0 :(得分:0)

我想我成功了:

var groups = from row in allDataView.Table.AsEnumerable()
                         group row by new { Convert.ToDateTime(row["DateOfData"]).Hour, Convert.ToDateTime(row["DateOfData"]).Date } into g
                         select new
                         {
                             FirstDate = g.First()["DateOfData"],
                             FirstValue = g.First()["Value"],
                             LastDate = g.Last()["DateOfData"],
                             LastValue = g.Last()["Value"]
                         };


            var result = groups.Select(grp => Convert.ToDouble(grp.FirstValue) - Convert.ToDouble(grp.LastValue));

答案 1 :(得分:-1)

我建议创建一个sp来处理日期时间值的分组。这应该有额外的好处,允许您的查询更快地运行,你shoukld然后能够通过linq更快地拉出结果。