我正在尝试计算该字段最近(2)次的平均值。
例如,这是一个样本数据集
Name VLoad Sload Timestamp
DT5227 254.1 270.5 19-09-2018 33:22 PM
DT5237 237.1 278.5 19-09-2018 33:22 PM
DT5237 237.1 278.5 19-09-2018 33:20 PM
DT5227 254.1 266 19-09-2018 33:20 PM
DT5237 237.1 278.5 19-09-2018 33:18 PM
DT5227 254.1 270.8 19-09-2018 33:18 PM
DT5227 254.1 273 19-09-2018 33:16 PM
DT5237 237.1 278.4 19-09-2018 33:16 PM
DT5227 254.1 273.1 19-09-2018 33:14 PM
DT5237 237.1 278.5 19-09-2018 33:14 PM
DT5227 254.1 275.8 19-09-2018 33:12 PM
DT5237 237.1 278.6 19-09-2018 33:12 PM
DT5237 237.1 278.6 19-09-2018 33:10 PM
DT5227 254.1 268 19-09-2018 33:10 PM
DT5237 237.1 278.6 19-09-2018 33:08 PM
DT5227 254.1 266.9 19-09-2018 33:08 PM
DT5237 237.1 278.5 19-09-2018 33:06 PM
现在有很多“名称”,但是我试图为列表中的每个名称计算最近5个实例的VLoad平均值。
我的努力:
var groups = (from x in _unitOfWork.Repository<Trucks>().Queryable()
group x by new {x.Name,x.Timestamp}
into gResult
select new
{
gResult.Key.Name,
Average = gResult.Average(x => x.VLoad),
gResult.Key.Timestamp
});
var result = groups.GroupBy(x => x.Name).SelectMany(x => x.OrderBy(r => r.Timestamp))
.Take(2);
我没有完全得到预期的结果。有人可以帮我解决我的Linq查询吗?
谢谢!
答案 0 :(得分:1)
如果我的猜测是正确的,这应该可以解决您的问题。 Try it online !
public static void Main()
{
var records = new []
{
new Record {Name = "DT5227", Vload = 0, Sload = 270.5, Timestamp = "18-09-2018 31:22 PM" },
new Record {Name = "DT5227", Vload = 254.1, Sload = 270.5, Timestamp = "19-09-2018 31:22 PM" },
new Record {Name = "DT5227", Vload = 264.1, Sload = 270.5, Timestamp = "19-09-2018 33:22 PM" }
};
var results = records.GroupBy(x => x.Name)
.Select(x => x
.OrderByDescending(r => r.Timestamp) // be sure to use DateTime here
.Take(2) // take last two thanks to OrderByDescending
.Select(r => r.Vload).Average()); // Builtin average!
// do what you want with results
Console.WriteLine(results.First());
}
答案 1 :(得分:0)
检索所有按名称和时间戳排序的行后,您可以使用Queue数据结构来为每个名称迭代地添加值,而仅使用最后X个加法来计算平均值。
这不是最有效的方法,但它会起作用。