2011-11-02 143 views
3

我有以下,但它不完全是我现在需要 - 它返回所有星期五的日期传入月C#获取下一个第N个星期五日期从今天的日期

public static IEnumerable<DateTime> ReturnNextNthWeekdaysOfMonth(DateTime dt, DayOfWeek weekday, int amounttoshow = 4) 
    { 
     var days = 
      Enumerable.Range(1, DateTime.DaysInMonth(dt.Year, dt.Month)).Select(
       day => new DateTime(dt.Year, dt.Month, day)); 

     var weekdays = from day in days 
         where day.DayOfWeek == weekday 
         orderby day.Day ascending 
         select day; 

     return weekdays.Take(amounttoshow); 
    } 

不过,我现在想返回从今天的日期,今年的第N个星期五日期,他们是在月的无关。

而我有点卡住...任何帮助极大赞赏。

+1

您是否看到[this](http://angstrey.com/index.php/2009/04/25/finding-the-next-date-for-day-of-week/)? – m0skit0

+2

愚蠢的问题,但你为什么不只是1)确定下一个星期五2)通过添加方法N-1次添加7天,将您的答案放入列表?这对我来说似乎是一个奇怪的使用LINQ。 – JSWork

回答

2
public static IEnumerable<DateTime> ReturnNextNthWeekdaysOfMonth(DateTime dt, DayOfWeek weekday, int amounttoshow = 4) 
{ 
    // Find the first future occurance of the day. 
    while(dt.DayOfWeek != weekday) 
     dt = dt.AddDays(1); 

    // Create the entire range of dates required. 
    return Enumerable.Range(0, amounttoshow).Select(i => dt.AddDays(i * 7)); 
} 

这首先查找第二天匹配weekday然后继续牛逼o创建amounttoshow DateTime实例,每个实例比搜索日期开始的时间都多7天。

0

更改最后一行

return weekdays.Where((x, i) => i % N == 0); 
2

怎么样想这...

public static List<DateTime> ReturnNextNthWeekdaysOfMonth(DateTime dt, DayOfWeek weekday, int amounttoshow = 4) 
    { 
     List<DateTime> list = new List<DateTime>(); 

     dt = dt.AddDays(weekday - dt.DayOfWeek);//set to the first day in the list 

     if (weekday <= dt.DayOfWeek) 
      dt = dt.AddDays(7); 

     for (int i = 0; i < amounttoshow; i++) 
     { 
      list.Add(dt); 
      dt = dt.AddDays(7); 
     } 

     return list; 
    } 

注意,因为它的立场,如果你在当天通过,则在第一次约会在列表中会下周而不是今天。如果你今天要被包括在你可以使用下面的代码,而不是这种情况下,第一次约会....

public static IEnumerable<DateTime> ReturnNextNthWeekdaysOfMonth(DateTime dt, DayOfWeek weekday, int amounttoshow = 4) 
    { 
     List<DateTime> list = new List<DateTime>(); 

     if (weekday < dt.DayOfWeek) 
      dt = dt.AddDays(7); 

     dt = dt.AddDays(weekday - dt.DayOfWeek); 

     for (int i = 0; i < amounttoshow; i++) 
     { 
      list.Add(dt); 
      dt = dt.AddDays(7); 
     } 

     return list; 
    } 
+1

这不适用于一周前的任何一天。即如果我要求下一个2星期二,现在的第一个结果应该是过去使用'dt = dt.AddDays(weekday - dt.DayOfWeek)的周二;' –

+0

@ J.Kommer:非常感谢,有更新的代码修复...可能的优化,以遵循;) – musefan

+1

仍然不好。先进行if检查,然后制作<而不是<=。 编辑:(错误假设你想包括当前的日子,如果它是正确的“DayOfWeek”开始) – JSWork

0

return (from z in Enumerable.Range (0, amounttoshow) 
let b = (from x in Enumerable.Range (0, 6) where DateTime.Now.AddDays (x).DayOfWeek == weekday select DateTime.Now.AddDays (x)).First() 
select b.AddDays (z * 7)); 
1

无需用费心更换整个方法体LINQ:

public static IEnumerable<DateTime> ReturnNextNthWeekdaysOfMonth(DateTime dt, DayOfWeek weekday, int amounttoshow = 4) 
{ 
    while(dt.DayOfWeek != weekday) 
     dt = dt.AddDays(1); 

    for (int i = 0; i < amounttoshow; i++) 
    { 
     yield return dt; 
     dt = dt.AddDays(7); 
    } 
} 
+1

var day = dt.DayOfWeek == weekday? dt:dt.AddDays(weekday - dt.DayOfWeek);是错的。 1)工作日可以比dt.DayOfWeek更大。这将导致你返回错误的结果 2)等号检查是毫无意义的。如果weekday == dt.DayOfWeek是真的,你只需要添加0天。 – JSWork

+0

我想你会遭受同样的问题,因为我的原始答案([见我的评论](http://stackoverflow.com/questions/7981106/c-sharp-get-next-nth-fridays-date-from-todays-日期/ 7981175#7981175)) – musefan

+0

@musefan的确你是对的。当我回到电脑时,我会修改开始条件,但其余的逻辑应该没问题 –

0

尝试此

public static IEnumerable<DateTime> ReturnNextNthWeekdaysOfMonth(DateTime dt, DayOfWeek weekday, int amounttoshow = 4) 
    { 
    // get the difference from the weekday 
    int diff = dt.DayOfWeek - weekday; 

    // amounttoshow * 7 is the number of days in a week (28 to get 4 weeks) 
    var days = 
     Enumerable.Range(1, amounttoshow * 7 + diff).Select(   
      day => DayOfYear(dt, day)); 

    var weekdays = from day in days 
        where day.DayOfWeek == weekday 
        orderby day.Day ascending 
        select day; 

    return weekdays.Take(amounttoshow); 
    } 

    // returns the day in datetime 
    public static DateTime DayOfYear(DateTime dt, int day) 
    { 
    DateTime firstDayOfYear = new DateTime(dt.Year, 1, 1); 
    DateTime dateTime = firstDayOfYear.AddDays(dt.DayOfYear - 1 + day); 

    return dateTime; 
    } 

为了得到一个值

DateTime d = new DateTime(2011, 11, 5); 
IEnumerable<DateTime> ie = ReturnNextNthWeekdaysOfMonth(d, DayOfWeek.Friday, 4); 

System.Diagnostics.Debug.WriteLine(ie.First().ToString()); 
+0

教你想使用查询... – Khan

0

更高速度的替代值(算术代替用于第一日期搜索循环,并移动昂贵乘法循环外) :

public static IEnumerable<DateTime> ReturnNextNthWeekdaysOfMonth(DateTime dt, 
    DayOfWeek weekday, int amounttoshow = 4) 
{ 
    var day = dt.AddDays(weekday > dt.DayOfWeek 
     ? weekday - dt.DayOfWeek 
     : 7 - weekday - dt.DayOfWeek); 
    var days = new List<DateTime>(); 
    for(var until = day.AddDays(7 * amounttoshow); 
     day < until; 
     day = day.AddDays(7)) 
     days.Add(day); 
    return days.ToArray(); 
} 
相关问题