【问题标题】:Calculate number of days left between two dates using LINQ query使用 LINQ 查询计算两个日期之间的剩余天数
【发布时间】:2021-03-25 13:15:46
【问题描述】:

我有一个解决方案,可以打印从今天到 2021 年 8 月 14 日的日期列表(星期五),它还打印到 2021 年 8 月 14 日的剩余天数,这是我在不同的功能中所做的,如何在一个 LINQ 查询中执行此操作,该查询将打印日期并打印剩余天数。这是我的代码;

 static void Main()
    {
        var dates = new List<DateTime>();

        DateTime from = DateTime.Today;

        DateTime to = new DateTime(2021, 08, 14);

        double dayLeft = to.Subtract(DateTime.Today).TotalDays;

        //var to = DateTime.Today.AddDays(14); 

        for (var dt = from; dt <= to; dt = dt.AddDays(1))
        {
            dates.Add(dt);
        }

        var allFridays = dates.Where(x => (int)x.DayOfWeek == 5);





        Console.WriteLine(string.Join(Environment.NewLine, allFridays));
        Console.WriteLine("Days Left are in Independence are : " + dayLeft);


        Console.ReadKey();
    }

【问题讨论】:

  • @PrasadTelkikar 我已经得到了与Console.WriteLine($"{string.Join(Environment.NewLine, allFridays)} {Environment.NewLine} Days left: {dayLeft}") 相同的结果,只需调用allFridays,它就会告诉我剩下的天数并打印所有日期,我想要这个查询var allFridays = dates.Where(x =&gt; (int)x.DayOfWeek == 5);两者都适合我
  • 在一个 Linq 查询中执行此操作的任何特定原因。实际上这在一个 linq 查询中是不可能的
  • 我希望这适用于计算机科学类或其他东西,而不是生产代码。

标签: c# linq date datetime


【解决方案1】:

首先计算这两个日期之间的总天数,然后使用Enumerable 枚举:

var difference = (to.Date - from.Date).TotalDays;
var dates = Enumerable.Range(0, (int)difference).Select(day => from.AddDays(day));

或者你可以不使用LINQ,只使用foreach

var dates = new List<DateTime>();
for(var i=0; i<difference; i++)
{
     dates.Add(from.AddDays(i));
}

【讨论】:

    【解决方案2】:

    我认为不可能在 1 个 Linq Query 中实现这一点。

    如果你真的想使用 Linq,你可以这样做

    DateTime from = DateTime.Today;
    
    DateTime to = new DateTime(2021, 08, 14);
    
    var mydates = Enumerable.Range(0, to.Subtract(from).Days).Select(x => from.AddDays(x));
    
    Console.WriteLine(string.Join(Environment.NewLine, mydates.Where(x=> (int)x.DayOfWeek == 5)));
    Console.WriteLine("Days Left are in Independence are : " + mydates.Count());
    

    请记住,可读性非常重要,由于这个原因,Linq 并不总是最好的(在某些情况下它也不是最快的)。
    唯一应该忽略可读性的时间是,如果你有时间限制执行和软件已在一个时间范围内完成。

    【讨论】:

      【解决方案3】:

      我不确定我是否理解你...,但似乎你想返回所有星期五和直到某个日期的日期计数。

      我建议创建这样的类:

      public class FridaysToDate
      {
          private DateTime startDate;
          private DateTime endDate;
          private DateTime firstFriday;
          private int daysLeft = 0;
          
          public FridaysToDate(DateTime _start, DateTime _end)
          {
              startDate = _start;
              endDate = _end;
              daysLeft = (int)(endDate - startDate).TotalDays;
              firstFriday = NearestFriday(_start);
          }
      
          private DateTime NearestFriday(DateTime initialDate)
          {
              int daysToFriday =  ((int) DayOfWeek.Friday - (int) initialDate.DayOfWeek + 7) % 7; 
              return initialDate.AddDays(daysToFriday);
          }   
          
          public List<DateTime> AllFridays
          {
              get => Enumerable.Range(0, (int)((daysLeft)/7)+1)
                  .Select((x, y)=> firstFriday.AddDays(y*7))
                  .ToList();
          }
          
          public override string ToString()
          {
              return $"Until '{endDate.ToString("yyyy-MM-dd")}' left {daysLeft} days(s), including {AllFridays.Count} fridays.";
          }
          
      }
      

      用法:

      FridaysToDate ftd = new FridaysToDate(DateTime.Today, new DateTime(2021, 08, 14));
      List<DateTime> fridays = ftd.AllFridays;
      //you can use the list of fridays now
      Console.WriteLine(ftd.ToString());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2019-09-27
        相关资源
        最近更新 更多