第一个记录和最后一个记录的值之间的差值Linq

本文关键字:记录 Linq 之间 第一个 最后一个 | 更新日期: 2023-09-27 18:24:58

我的列表中有以下数据

profilename    date        score
prof1          01/10/2015  15
prof1          02/10/2015  15
prof1          03/10/2015  18
....
prof1          25/10/2015  24
prof2          01/10/2015  69
prof2          02/10/2015  70
prof3          01/10/2015  115
prof3          02/10/2015  115
prof2          03/10/2015  73
prof3          03/10/2015  119
....
prof2          25/10/2015  98
prof3          25/10/2015  187

我想根据每个档案的日期来计算第一张和最后一张记录之间的分数差。所需输出为

prof1 9
prof2 29
prof3 72

我不知道如何在Linq中开始这个查询,因为我是新手。任何帮助都将不胜感激。

第一个记录和最后一个记录的值之间的差值Linq

我想根据每个档案的日期来计算第一张和最后一张记录之间的分数差。

因此,您需要profilename分组按照date对各组进行排序,取第一项和最后一项,计算差异

var result =
    (from item in list
     group item by item.profilename into g
     let groupItems = g.OrderBy(gi => Convert.ToDateTime(gi.date))
     select new { profilename = g.Key, score = groupItems.Last().score - groupItems.First().score }
    ).ToList();

您可以根据profilename和计算差异进行分组,如:

var result = list.GroupBy(c => c.profilename).
             Select(c => new 
                    { 
                       profilename = c.Key, 
                       score = c.FirstOrDefault(m => m.date == c.Max(v => v.date)).score - 
                               c.FirstOrDefault(m => m.date == c.Min(v => v.date)).score 
                    }).ToList();

如果是评论中提到的Linq-To-Sql,这可能是最好的方法:

var result = profiles
        .GroupBy(p => p.profilename)
        .Select(g => new {
            profilename = g.Key,
            firstscore = g.OrderBy(p => p.date).First().score,
            lastscore = g.OrderByDescending(p => p.date).First().score
        })
        .Select(x => new { x.profilename, diff = x.lastscore - x.firstscore })
        .ToList();

演示小提琴

不是最好的性能,但如果你关心性能,就不要使用LINQ

.GroupBy(e => e.Group).Select(e => new KeyValuePair<string, int>(e.Key, e.OrderBy(f => f.Date).Last().Num - e.OrderBy(f => f.Date).First().Num)).ToList();

这似乎有效(下面的完整代码,使用DateTime):

var l = list.OrderBy(i => i.date)
            .GroupBy(i => i.profileName)
            .Select(e => new {prof = e.First().profileName, diff = e.Last().score - e.First().score}).ToList();

这里有一个包含您的数据的可编译示例:

class Rate
{
    public Rate(string p, string d, int s)
    {
        profileName = p;
        date = DateTime.Parse(d);
        score = s;
    }
    public string profileName;
    public DateTime date;
    public int score;
}
void Main()
{
    var list = new List<Rate>()
    { 
        new Rate("prof1", "01/10/2015", 15),
        new Rate("prof1", "02/10/2015", 15),
        new Rate("prof1", "03/10/2015", 18),
        new Rate("prof1", "25/10/2015", 24),
        new Rate("prof2", "01/10/2015", 69),
        new Rate("prof2", "02/10/2015", 70),
        new Rate("prof3", "01/10/2015", 115),
        new Rate("prof3", "02/10/2015", 115),
        new Rate("prof2", "03/10/2015", 73),
        new Rate("prof3", "03/10/2015", 119),
        new Rate("prof2", "25/10/2015", 98),
        new Rate("prof3", "25/10/2015", 184),
    };
    var l = list.OrderBy(i => i.date)
                .GroupBy(i => i.profileName)
                .Select(e => new {prof = e.First().profileName, diff = e.Last().score - e.First().score}).ToList();
}