【问题标题】:Calcuate Average Days Between of a List of Dates in C#计算 C# 中日期列表之间的平均天数
【发布时间】:2022-01-05 10:15:30
【问题描述】:

我有一个简单的列表。每个日期都是任意的,但按时间顺序排列。

我想确定日期之间的平均天数。

例如:

  • 01/01/2022
  • 01/02/2022
  • 01/04/2022

...应该返回1.5 的平均值。 (本例中的分母是日期之间的时间跨度。在这种情况下,3 个日期之间只有 2 个时间跨度)

因为在 1/1 和 1/2 之间有 1 天,在 1/2 和 1/4 之间有 2 天。

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

有没有一种 LINQ 方法可以做到这一点,而不必手动遍历列表中的每个列表项?

【问题讨论】:

  • 很确定你的例子中的平均值是 1 而不是 1.5,对吧? 1 day + 2 days / 3 dates = 3/3 = 1
  • 没有。在这种情况下,分母是日期之间的时间跨度。在这种情况下,3 个日期之间只有 2 个时间跨度。

标签: c# list linq


【解决方案1】:

不确定是否有更好的方法,但这是我刚刚整理的一个,它似乎对我来说很可靠

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

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

【讨论】:

    【解决方案2】:

    这将只对 List 进行一次迭代:

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

    【讨论】:

      【解决方案3】:

      试试这个

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

      【讨论】:

        【解决方案4】:

        您可以使用ZipAggregate 获得总天数,然后除以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)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-27
          • 1970-01-01
          • 2022-06-11
          • 2021-11-18
          • 1970-01-01
          • 1970-01-01
          • 2019-07-12
          • 2023-01-25
          相关资源
          最近更新 更多