繁体   English   中英

使用 LINQ 查询计算两个日期之间的剩余天数

[英]Calculate number of days left between two dates using LINQ query

我有一个解决方案,可以打印从今天到 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();
    }

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

如果您真的想使用 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 并不总是最好的(在某些情况下也不是最快的)。
唯一应该忽略的时间可读性是,如果您对执行有时间限制并且软件在时间范围内完成。

首先计算这两个日期之间的总天数,然后使用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));
}

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

我建议像这样创建 class :

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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM