您如何遍历开始和结束 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 日的天数列表,但显然 bookedDates
是 List<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;
}
}
基本上,我正在尝试获取给定 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 日的天数列表,但显然 bookedDates
是 List<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;
}
}