gpt4 book ai didi

linq - 使用LINQ计算与上一项的差异

转载 作者:行者123 更新时间:2023-12-03 12:00:19 25 4
gpt4 key购买 nike

我正在尝试使用LINQ为图准备数据。

我无法解决的问题是如何计算“与以前的差异”。

我期望的结果是

ID = 1,日期=现在,DiffToPrev = 0;

ID = 1,日期=现在+ 1,DiffToPrev = 3;

ID = 1,日期=现在+ 2,DiffToPrev = 7;

ID = 1,日期=现在+ 3,DiffToPrev = -6;

等等...

您能帮我创建这样的查询吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public class MyObject
{
public int ID { get; set; }
public DateTime Date { get; set; }
public int Value { get; set; }
}

class Program
{
static void Main()
{
var list = new List<MyObject>
{
new MyObject {ID= 1,Date = DateTime.Now,Value = 5},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(1),Value = 8},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(2),Value = 15},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(3),Value = 9},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(4),Value = 12},
new MyObject {ID= 1,Date = DateTime.Now.AddDays(5),Value = 25},
new MyObject {ID= 2,Date = DateTime.Now,Value = 10},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(1),Value = 7},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(2),Value = 19},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(3),Value = 12},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(4),Value = 15},
new MyObject {ID= 2,Date = DateTime.Now.AddDays(5),Value = 18}

};

Console.WriteLine(list);

Console.ReadLine();
}
}
}

最佳答案

一种选择(对于LINQ to Objects)是创建自己的LINQ运算符:

// I don't like this name :(
public static IEnumerable<TResult> SelectWithPrevious<TSource, TResult>
(this IEnumerable<TSource> source,
Func<TSource, TSource, TResult> projection)
{
using (var iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
yield break;
}
TSource previous = iterator.Current;
while (iterator.MoveNext())
{
yield return projection(previous, iterator.Current);
previous = iterator.Current;
}
}
}

这样一来,您就可以仅使用源序列的一次传递来执行投影,这始终是一件好事(想像在大型日志文件上运行它)。

请注意,它将把长度为 n的序列投影到长度为 n-1的序列中-例如,您可能想在“dummy”第一个元素之前添加前缀。 (或将方法更改为包括一种。)

以下是使用方式的示例:
var query = list.SelectWithPrevious((prev, cur) =>
new { ID = cur.ID, Date = cur.Date, DateDiff = (cur.Date - prev.Date).Days) });

请注意,这将包括一个ID的最终结果和下一个ID的第一个结果...您可能希望先按ID对序列进行分组。

关于linq - 使用LINQ计算与上一项的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3683105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com