【问题标题】:C# day of week date ranges repetition patternC# 星期几日期范围重复模式
【发布时间】:2014-03-17 21:20:30
【问题描述】:

我正在制定一个议程,并且我有这种方法可以为我提供一周中选定日期的给定时间段内发生的日期。这很好用。

现在我的问题: 我正在尝试实现一个选项来选择重复模式。

例如,每 2 周一次。

所以我需要一种方法来不包括不适合的日期。

例如:

    // example dates
    string strStart = "2014-03-17";
    string strEnd = "2014-04-14";

    DateTime start, end;

    DateTime.TryParse(strStart, out start);
    DateTime.TryParse(strEnd, out end);

    // example days of week
    List<DayOfWeek> dw = new List<DayOfWeek>();
    dw.Add(DayOfWeek.Monday);
    dw.Add(DayOfWeek.Tuesday);

    Dates = GetDayofWeekDateOcurrences(start, end, dw, 2);

这给出了这个日期列表;

// result
/*
    > 2014-03-17
    > 2014-03-18
    > 2014-03-24
    > 2014-03-25
    > 2014-03-31
    > 2014-04-01
    > 2014-04-07
    > 2014-04-08
    > 2014-04-14
*/



// desired dates for a two week repetition
/*
    > 2014-03-17 // monday
    > 2014-03-18 // tuesday

    > 2014-04-07 // monday
    > 2014-04-08  // tuesday

*/

方法;

private List<DateTime> GetDayofWeekDateOcurrences(DateTime start, DateTime end, List<DayOfWeek> dw, int repeatOn)
{

   // repeatOn Will be for example : every 2 weeks;

    int numberOfDays = end.Subtract(start).Days + 1;

    var dates = Enumerable.Range(0, numberOfDays)
                          .Select(i => start.AddDays(i)) // (i * repeatOn)  gives wrong dates
                          .Where(d => dw.Contains(d.DayOfWeek) && d <= end).ToList();


    return dates.ToList();

}

【问题讨论】:

  • 对不起,如果我不能更清楚。我编辑了这个问题,希望能更好地表达自己。
  • 您的代码工作正常(我只是尝试)。究竟是什么问题?
  • 该代码适用于周一和周四的开始和结束范围内的日期列表。问题是我只想包含 2 周重复的日期。评论(两周重复所需的日期)谢谢
  • 我很困惑...您希望的日期相隔三周,而我预计相隔两周。在该范围内还有其他一对相隔两周的日期(事实上,所有日期都与至少一个其他日期相隔两周)......

标签: .net linq c#-4.0 lambda


【解决方案1】:

如果您想使用 LINQ,这应该可以工作:

private List<DateTime> GetDayofWeekDateOcurrences(DateTime start, DateTime end, int everyNthWeek, List<DayOfWeek> dw)
{
    int numberOfDays = end.Subtract(start).Days + 1;

    var dates = Enumerable.Range(0, numberOfDays)
        .GroupBy(i => i / 7 % everyNthWeek)
        .Where(g => g.Key == 0)
        .SelectMany(g => g.Select(i => start.AddDays(i))
                          .Where(d => dw.Contains(d.DayOfWeek)))
        .ToList();

    return dates;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多