每两周一次的 C# 逻辑

本文关键字:一次 逻辑 两周 | 更新日期: 2023-09-27 18:33:01

任何人请帮助我每两周一次的 C# MVC 5 日历逻辑。我已经实现了每周约会。

这是我的每周代码。它正在工作。

var day = (from o in db.Suburbs.AsEnumerable()
    ..etc
    select new 
    {
    DT.DeliveryDay,
}).ToList();

foreach (var temp in day)
{
    if (Type == "weekly")
    {
        int weeklyLogic = ((int)Enum.Parse(typeof(DayOfWeek), temp.DeliveryDay) - (int)today.DayOfWeek + 7) % 7;
        DateTime  nextweeklyLogic = today.AddDays(weeklyLogic);
        Firstweek = nextweeklyLogic;
        int weekly2 = (((int)Enum.Parse(typeof(DayOfWeek), temp.DeliveryDay) - (int)today.DayOfWeek + 7) % 7) + 7;
        DateTime Secondweek = today.AddDays(weekly2);
        int weekly3 = (((int)Enum.Parse(typeof(DayOfWeek), temp.DeliveryDay) - (int)today.DayOfWeek + 7) % 7) + 14;
        DateTime Thirdweek = today.AddDays(weekly3);
        etc..
    }
    else if (Type == "fortnightly")
    {
    }
}

例如,对于Type == "fortnightly",例如temp.DeliveryDay == "Friday",那么基于今天(2 月 2 日),我希望输出为:

February 5th (First Friday after today, since temp.DeliveryDay is friday)
February 19th (14 days or fortnight from the first output)
March 4th
etc. 

每两周一次的 C# 逻辑

第一件事 - 你重复你所有的行为来获得每周的约会。我建议分解您的操作。我看到两个主要部分。

  • 获取今天之后一周中任意日期的日期。
  • 从上面确定的日期开始获取定期重复日期。

这种方法可以照顾第一部分,

DateTime FirstDayOfWeekAfter(DateTime day, DayOfWeek dayOfWeek)
{
    // We don't want to return today. 
    day = day.AddDays(1);
    // If the current tested day is the desired day of week, return. 
    if (day.DayOfWeek == dayOfWeek)
    {
        return day;
    }
    // else call again with the next day.
    else
    {
        return FirstDayOfWeekAfter(day, dayOfWeek);
    }
}

这对方法将负责第二部分。我这里有第一种方法,所以当你实际使用它时,不需要强制转换为(每周一天)。

IEnumerable<DateTime> GetPeriodicDeliveryDates(DateTime today, object dayOfDelivery, int period)
{
    return GetPeriodicDeliveryDates(today, (DayOfWeek)dayOfDelivery, period);
}
IEnumerable<DateTime> GetPeriodicDeliveryDates(DateTime today, DayOfWeek dayOfDelivery, int period)
{
    // Get the date of the first delivery. 
    var firstDelivery = FirstDayOfWeekAfter(today, dayOfDelivery);
    while (true)
    {
        // Infinitely yield dates separated by the supplied period length.
        yield return firstDelivery;
        firstDelivery = firstDelivery.AddDays(period);
    }
}

这些方法的使用很简单。每周和每两周枚举的唯一区别是这段时间传递到 GetPeriodicDeliveryDates() .您确实希望确保不要尝试完全枚举GetPeriodicDeliveryDates() - 它是无限序列的。

var today = DateTime.Today;
var temp = new { DeliveryDay = "Friday" };
var weekly = GetPeriodicDeliveryDates(today, Enum.Parse(typeof(DayOfWeek), temp.DeliveryDay), 7);
var fortnightly = GetPeriodicDeliveryDates(today, Enum.Parse(typeof(DayOfWeek), temp.DeliveryDay), 14);
weekly.Take(5).ToList().ForEach(x => Console.WriteLine(x));
Console.WriteLine();
fortnightly.Take(5).ToList().ForEach(x => Console.WriteLine(x));