gpt4 book ai didi

C# LINQ TimeSpan 平均天数

转载 作者:行者123 更新时间:2023-11-30 20:10:29 25 4
gpt4 key购买 nike

我正在学习 LINQ 并想要一个与以下代码等效的 LINQ 查询。

IEnumerable 列表包含一个排序的日期列表:从旧到新。

下面的代码派生出TimeSpan s 通过从数组的第一个元素日期中减去数组的第零个元素日期,从第二个元素日期中减去第一个元素日期,从第三个元素中减去第二个元素日期,依此类推。 TimeSpan.Days然后在代码的其他地方进行平均。

我相信 LINQ 查询不需要构造数组。 IEnumerable<DateTime>结构可以用作数据源。

 IEnumerable<DateTime> list; // contains a sorted list of oldest to newest dates

// build DateTime array

DateTime[] datesArray = null;
TimeSpan ts;
List<int> daysList = new List<int>();

datesArray = (from dt in list
select dt).ToArray();

// loop through the array and derive the TimeSpan by subtracting the previous date,
// contained in the previous array element, from the date in the current array element.
// start the loop at element 1.

for (int i = 1; i < list.Count(); i++)
{
ts = datesArray[i].Subtract(datesArray[i - 1]); // ts is a TimeSpan type
daysList.Add(ts.Days);
// add the TimeSpan.Days to a List<int> for averaging elsewhere.
}

谢谢,

斯科特

最佳答案

我想你想要:

double averageDays = list
.Skip(1)
.Zip(list, (next, prev) => (double)next.Subtract(prev).Days)
.Average();

请注意,这是一个有损平均值。您确定不想改用 TotalDays 吗?

编辑:

它的工作方式是用序列的“延期”版本覆盖序列,这样可以很容易地计算连续的增量。然后只需对增量进行平均即可产生结果。

为了比较,您现有代码的“忠实”翻译如下:

double averageDays = Enumerable
.Range(1, list.Count - 1)
.Average(i => (double)list[i].Subtract(list[i - 1]).Days);

关于C# LINQ TimeSpan 平均天数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4975628/

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