计算 C# 中日期列表之间的平均天数

问题描述 投票:0回答:4

我有一个简单的

List<DateTime>
。每个日期都是任意的,但按时间顺序排列。

我想确定日期之间的平均日跨度。

例如:

  • 2022年1月1日
  • 2022年1月2日
  • 2022年1月4日

...应返回平均值

1.5
。 (本例中的分母是日期之间的时间跨度。在本例中,3 个日期之间只有 2 个时间跨度)

因为 1/1 到 1/2 之间有

1
天,1/2 到 1/4 之间有
2
天。

(1 day + 2 days) / 2 timespans = 1.5 avg

是否有 LINQ 方法可以执行此操作,而无需手动迭代列表中的每个列表项?

c# list linq
4个回答
3
投票

不确定是否有更好的方法,但这是我刚刚组合在一起的方法,它似乎对我来说可靠地工作

var avg = myList.Zip(myList.Skip(1), (dt1, dt2) => dt2 - dt1).Average(dt => dt.Days);

编辑:刚刚检查了文档,.Zip 方法不在 .NET 4 之前的版本中


1
投票

这只会迭代列表一次:

Enumerable.Range(1, dates.Count() - 1)
    .Select(i => (dates[i] - dates[i - 1]).TotalDays)
    .Average();

1
投票

试试这个

double aveDays= (days.Last()-days.First()).Days /((double)days.Count-1);
    

0
投票

您可以使用

Zip
Aggregate
获取总天数,然后除以
Count - 1
,即中间的间隙数。

var avg = dates.Zip(dates.Skip(1), (dt1, dt2) => dt2 - dt1)
  .Aggregate(0d, (a, dt) => a + dt.Days)
  / (dates.Count - 1);

请注意,我使用的是

0d
,否则它会生成整数 (
1
) 而不是双精度数 (
1.5
)。

© www.soinside.com 2019 - 2024. All rights reserved.