第一个记录和最后一个记录的值之间的差值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中开始这个查询,因为我是新手。任何帮助都将不胜感激。
我想根据每个档案的日期来计算第一张和最后一张记录之间的分数差。
因此,您需要按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();
}