在C#中,找到DateTime数组中的间隙的最佳方法是什么?

leo*_*ora 5 c# collections datetime

我有一个相隔一个月的日期列表,因为所有日期都是"本月的第一个星期一".在某些情况下,几个月都会丢失,所以我需要编写一个函数来确定所有日期是否都是连续的

因此,例如,如果这是日期列表,则函数将返回true,因为所有项目都是"本月的第一个星期五",并且没有间隙.以下示例将返回true.

 var date = new DateTime(2013, 1, 4);
 var date1 = new DateTime(2013, 2, 1);
 var date2 = new DateTime(2013, 3, 1);
 var date3 = new DateTime(2013, 4, 5);

 var dateArray = new DateTime[]{date, date1, date2, date3};
 bool isConsecutive = IsThisListConsecutive(dateArray);
Run Code Online (Sandbox Code Playgroud)

以下示例将返回false,因为即使它们也都是"本月的第一个星期五",它也错过了2013年3月的项目.

 var date = new DateTime(2013, 1, 4);
 var date1 = new DateTime(2013, 2, 1);
 var date3 = new DateTime(2013, 4, 5);

 var dateArray = new DateTime[]{date, date1, date3};
 bool isConsecutive = IsThisListConsecutive(dateArray);
Run Code Online (Sandbox Code Playgroud)

所以我试图找出IsThisListConsecutive()方法的正确逻辑:

这是我的第一次尝试:(注意我已经预先知道所有日期都是一周的同一天和同月的一周,所以我唯一需要的是缺少的插槽)

  private bool IsThisListConsecutive(IEnumerable<DateTime> orderedSlots)
    {
        DateTime firstDate = orderedSlots.First();
        int count = 0;
        foreach (var slot in orderedSlots)
        {
            if (slot.Month != firstDate.AddMonths(count).Month)
            {
                return false;
            }
            count++;
        }
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

如果列表从一年跨越到另一年,则上面的代码将起作用.我希望得到关于创建此函数的更好方法的任何建议,以及如何重写该行以处理跨越多年的日期.

pok*_*oke 2

注意:这完全未经测试,日期检查可能非常糟糕或有点多余,但 \xe2\x80\x99 是我现在能想到的最好的^^

\n\n
public bool AreSameWeekdayEveryMonth(IEnumerable<DateTime> dates)\n{\n    var en = dates.GetEnumerator();\n    if (en.MoveNext())\n    {\n        DayOfWeek weekday = en.Current.DayOfWeek;\n        DateTime previous = en.Current;\n        while (en.MoveNext())\n        {\n            DateTime d = en.Current;\n            if (d.DayOfWeek != weekday || d.Day > 7)\n                return false;\n            if (d.Month != previous.Month && ((d - previous).Days == 28 || (d - previous).Days == 35))\n                return false;\n            previous = d;\n        }\n    }\n    return true;\n}\n
Run Code Online (Sandbox Code Playgroud)\n