计算最后X条记录的平均值

时间:2018-09-30 11:14:37

标签: 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
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查询吗?

谢谢!

2 个答案:

答案 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个加法来计算平均值。

这不是最有效的方法,但它会起作用。