首页 文章

创建两个日期之间所有日期的数组或列表[重复]

提问于
浏览
111

这个问题在这里已有答案:

我正在生成多系列图表,其中包含沿X轴的日期 .

问题是并非图表中的所有系列都在日期范围内具有相同的日期 . 这意味着,如果我选择2月1日到4月30日,那么一个系列可能有数据从2月1日开始,但只持续到3月底,但另一个系列可能有整个日期范围的数据 .

这会扭曲我需要创建的图表 . 去,给定在查询开始时采用的日期范围我想生成一个日期列表并填充要绘制的数据,用那些没有数据的日期填充那些0的系列 .

5 回答

  • 23
    list = list.Where(s => s.startDate >= Input_startDate && s.endDate <= Input_endDate);
    
  • 1

    LINQ:

    Enumerable.Range(0, 1 + end.Subtract(start).Days)
              .Select(offset => start.AddDays(offset))
              .ToArray();
    

    For loop:

    var dates = new List<DateTime>();
    
    for (var dt = start; dt <= end; dt = dt.AddDays(1))
    {
       dates.Add(dt);
    }
    

    编辑:对于时间序列中默认值的填充值,您可以枚举完整日期范围内的所有日期,并直接从系列中选择日期值(如果存在),否则选择默认值 . 例如:

    var paddedSeries = fullDates.ToDictionary(date => date, date => timeSeries.ContainsDate(date) 
                                                   ? timeSeries[date] : defaultValue);
    
  • 258
    public static IEnumerable<DateTime> GetDateRange(DateTime startDate, DateTime endDate)
    {
        if (endDate < startDate)
            throw new ArgumentException("endDate must be greater than or equal to startDate");
    
        while (startDate <= endDate)
        {
            yield return startDate;
            startDate = startDate.AddDays(1);
        }
    }
    
  • 29

    我知道这是一个旧帖子,但尝试使用扩展方法:

    public static IEnumerable<DateTime> Range(this DateTime startDate, DateTime endDate)
        {
            return Enumerable.Range(0, (endDate - startDate).Days + 1).Select(d => startDate.AddDays(d));
        }
    

    并像这样使用它

    var dates = new DateTime(2000, 1, 1).Range(new DateTime(2000, 1, 31));
    

    您可以随意选择自己的日期,而不必限制自己到2000年1月 .

  • 3

    我们的常驻大师Jon Skeet有一个很棒的Range Class可以为DateTimes和其他类型做到这一点 .

相关问题