您如何遍历开始和结束 DateTimes 的 class,在每次迭代中将每个日期范围之间的天数存储到列表中?

How do you loop through a class of start and end DateTimes, storing the days between each date range to a list, with each iteration?

基本上,我正在尝试获取给定 Cottage_ID 的可用日期列表(制作假期预订系统)。

不确定我的逻辑是否合理,但我在想,如果有从今天到 2019 年最后一天的所有日期 List<DateTime>

然后我遍历 class 个日期范围,这些日期范围填充了数据库中的预订日期,并用这些填充了一个新的 List;然后创建第三个列表,如 availableDates = allDays.Except(bookedDates)

问题是一个列表是 List<DateTime>,另一个是 List<DateRange>,其中有 2 个 DateTime Properties

如何遍历 dateRange class 然后为每个日期范围存储到达和离开日期之间的所有天数?

从数据库获取预订日期的服务方法

  public List<DateRange> GetBookedDates(int id)
    {
        DateRange dateRange = new DateRange();

        DateTime start = Convert.ToDateTime(dateRange.Arrive);

        DateTime endDate = Convert.ToDateTime(dateRange.Depart);

        SqlConnection conn = new SqlConnection(dataSource);

        List<DateRange> bookedDates = new List<DateRange>();

        //To avoid sql injections parameters are used so the sql query is not concatinated with user input.  
        string sqlQueryDeleteBooking = "SELECT Arrive, Depart FROM dbo.Bookings WHERE Cottage_ID=@id";

        SqlCommand cmd = new SqlCommand(sqlQueryDeleteBooking, conn);
        cmd.Parameters.AddWithValue("@id", id);

        conn.Open();

        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            if (!reader.HasRows)
            {
                throw new Exception();
            }
            else
            {
                bookedDates.Add(new DateRange()
                {


                    Arrive = Convert.ToDateTime(reader["Arrive"]),
                    Depart = Convert.ToDateTime(reader["Depart"]),

                });

                for (DateTime dates = start; dates <= endDate; dates = dates.AddDays(1))
                {

                    bookedDates.Add(dates);

                }
            }


        }reader.NextResult();

        return bookedDates;
    }

该循环用于获取从今天到 12 月 31 日的天数列表,但显然 bookedDatesList<DateRange> 而不是 List<DateTime> 我可以将 dates 作为类型DateRange 或者反之亦然?

获取一年中所有天数的服务方法

     public List<DateTime> GetAvailableDates(int id)
    {
        DateTime start = DateTime.Today;
        string end = "31/12/2019";
        DateTime endDate = DateTime.Parse(end);

        List<DateTime> allDays = new List<DateTime>();

        for (DateTime dates = start; dates <= endDate; dates = dates.AddDays(1))
        {

            allDays.Add(dates);

        }

        return allDays;
    }

日期范围Class

[DataContract]
public class DateRange
{
   [DataMember]
   public DateTime Arrive { get; set; }
   [DataMember]
   public DateTime Depart { get; set; }

}

}

所以是的,想法是从 allDays 列表中删除 DateRange 中的所有预订天数。

我有一个 List<DateTime> allDays 和一个 List<DateRange> bookedDate 如何一起使用它们?

TIA!

我更愿意return可用日期作为延迟可枚举:

public static IEnumerable<DateTime> GetAvailableDates(int id)
{
    DateTime startDate = DateTime.Today;
    DateTime endDate = new DateTime(2019, 12, 31);
    var bookedDates = GetBookedDates(id);
    for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
    {
        if (bookedDates.Any(range => date >= range.Arrive && date <= range.Depart)) continue;
        yield return date;
    }
}