簡體   English   中英

檢查日期范圍在 c# 中是否連續,周六和周日除外

[英]Check if date range is sequential in c# except Saturday and Sunday

我想確定日期時間列表是否是連續的。

此外,如果列表中缺少的日期時間是星期六或星期日,則該列表也

例子

是順序的

1.

  • 2020-11-02 ( 莫 )
  • 2020-10-30 ( 周五 )
  • 2020-10-29 ( 日 )
  • 2020-10-28 ( 我們 )
  • 2020-10-27 ( 塗 )
  • 2020-11-06 ( 周五 )
  • 2020-11-05 ( 日 )
  • 2020-11-04 ( 我們 )
  • 2020-11-03 ( 塗 )
  • 2020-11-02 ( 莫 )

不是順序的

3.

  • 2020-11-03 ( 塗 )
  • 2020-10-30 ( 周五 )
  • 2020-10-29 ( 日 )
  • 2020-10-28 ( 我們 )
  • 2020-10-27 ( 塗 )
  • 2020-11-06 ( 周五 )
  • 2020-11-05 ( 日 )
  • 2020-11-04 ( 我們 )
  • 2020-11-02 ( 莫 )

我想念星期六星期天的邏輯。 這是我的片段

  public static bool IsSequential(IEnumerable<DateTime> dates)
    {
        var startDate = dates.FirstOrDefault();

        return dates
            .Select((d, i) => new {Date = d, Index = i})
            .All(d => (d.Date - startDate).Days == d.Index);
    }

你可能會做這樣的事情。 當日期按升序和降序排列時,它應該可以工作。

public static bool IsSequential(this IList<DateTime> dates)
{
    DateTime currentDate;
    DateTime nextDate;
    for (int index = 0; index < dates.Count - 1; index++)
    {
        currentDate = dates[index];
        nextDate = dates[index + 1];

        var dayDiff = Math.Abs((nextDate.Date - currentDate.Date).Days);
        var areSequentialDates = dayDiff == 1 ||
            (dayDiff == 3 && (currentDate.DayOfWeek == DayOfWeek.Friday || nextDate.DayOfWeek == DayOfWeek.Friday));

        if (!areSequentialDates)
            return false;
    }

    return true;
}

另一種方法,假設降序:

public static bool IsSequential(IEnumerable<DateTime> dates)
{
    if (dates != null)
    {
        DateTime nextDate = dates.FirstOrDefault().Date;
        foreach (DateTime dt in dates)
        {
            if (!dt.Date.Equals(nextDate))
            {
                return false;
            }
            nextDate = dt.Date.AddDays(dt.DayOfWeek == DayOfWeek.Monday ? -3 : -1);
        }
    }            
    return true;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM