C# 计算最后X个记录数的平均值
我试图计算一个字段最后(2)次出现的平均值 例如,这是一个示例数据集C# 计算最后X个记录数的平均值,c#,linq,C#,Linq,我试图计算一个字段最后(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 DT523
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);
var groups=(来自_unitOfWork.Repository().Queryable()中的x)
按新{x.Name,x.Timestamp}分组x
进入大结局
选择新的
{
gResult.Key.Name,
平均值=结果平均值(x=>x.v负载),
gResult.Key.Timestamp
});
var result=groups.GroupBy(x=>x.Name)。SelectMany(x=>x.OrderBy(r=>r.Timestamp))
.采取(2);
我并没有得到预期的结果。有人能帮我解决我的Linq问题吗
谢谢 检索按名称和时间戳排序的所有行后,可以使用队列数据结构为每个名称迭代添加值,并且只使用最后的X个添加值来计算平均值
这不是最有效的方法,但它会起作用。如果我的猜测是正确的,这应该可以解决您的问题
@Navyseal如果您对代码有任何疑问,请随时提问
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());
}