Xamarin/C# - 在日期范围内查找周末的方法。为什么我陷入循环并且无法增加当前日期?
Xamarin/C# - Method to find weekends in a date range. Why am I stuck in loop and unable to increment current date?
问题: 我的 Xamarin 项目中有一个页面需要两个用户输入的日期并检查该范围内的所有星期六和星期日,将所有这些日期添加到列表中然后我可以计算并从一天的总数中扣除。当我 运行 第二个日期选择器时,屏幕将在大约一分钟后冻结并使应用程序崩溃。我的输出 window 给了我 LOS 溢出消息。当我在 'getWeekendCount()' 方法上放置一个断点时,我发现 AddDays(1) 方法没有增加 'date' 的值并且似乎在我认为导致溢出的同一日期上循环问题。
我不明白为什么会这样,希望得到任何帮助。
public Calculator()
{
InitializeComponent();
//OnDateSelected(null, null);
dateFrom.SetValue(DatePicker.MinimumDateProperty, DateTime.Now);
dateTo.SetValue(DatePicker.MinimumDateProperty, DateTime.Now);
}
public int getWeekendCount(DateTime a, DateTime b)
{
List<DateTime> allDates = new List<DateTime>();
Console.WriteLine("Date From: " + a.Date);
Console.WriteLine("Date To: " + b.Date);
for (DateTime date = a.Date; date <= b.Date; date.AddDays(1))
{
if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday)
{
allDates.Add(date);
Console.WriteLine(allDates);
}
}
int weekendCount = allDates.Count();
return weekendCount;
}
void OnDateSelected(object sender, DateChangedEventArgs e)
{
if(dateTo.Date < dateFrom.Date)
{
leaveDaysLabel.Text = "Days: Invalid Selection";
}
else if (dateTo.Date == dateFrom.Date)
{
leaveDaysLabel.Text = "Days: 1";
}
else
{
Console.WriteLine("Date From: " + dateFrom.Date);
Console.WriteLine("Date To: " + dateTo.Date);
int count = getWeekendCount(dateFrom.Date, dateTo.Date);
Console.WriteLine(count);
int days = (dateTo.Date - dateFrom.Date).Days - count;
leaveDaysLabel.Text = String.Format("Days: {0}", days);
leaveHoursLabel.Text = "Hours: " + (days * 7.4).ToString();
}
}
如果您检查 AddDays
定义,您会发现它不会修改您的变量。只有 returns 个新日期。所以你的循环会一直持续下去
所以你应该改变你的循环。一个例子
while(a.Date <= b.Date)
{
if (a.DayOfWeek != DayOfWeek.Saturday && a.DayOfWeek != DayOfWeek.Sunday)
{
allDates.Add(a);
Console.WriteLine(allDates);
}
a = a.AddDays(1);
}
此外,也许您应该只在日期 a
上调用 WriteLine
而不是整个列表。或者在循环后打印整个列表。
问题: 我的 Xamarin 项目中有一个页面需要两个用户输入的日期并检查该范围内的所有星期六和星期日,将所有这些日期添加到列表中然后我可以计算并从一天的总数中扣除。当我 运行 第二个日期选择器时,屏幕将在大约一分钟后冻结并使应用程序崩溃。我的输出 window 给了我 LOS 溢出消息。当我在 'getWeekendCount()' 方法上放置一个断点时,我发现 AddDays(1) 方法没有增加 'date' 的值并且似乎在我认为导致溢出的同一日期上循环问题。
我不明白为什么会这样,希望得到任何帮助。
public Calculator()
{
InitializeComponent();
//OnDateSelected(null, null);
dateFrom.SetValue(DatePicker.MinimumDateProperty, DateTime.Now);
dateTo.SetValue(DatePicker.MinimumDateProperty, DateTime.Now);
}
public int getWeekendCount(DateTime a, DateTime b)
{
List<DateTime> allDates = new List<DateTime>();
Console.WriteLine("Date From: " + a.Date);
Console.WriteLine("Date To: " + b.Date);
for (DateTime date = a.Date; date <= b.Date; date.AddDays(1))
{
if (date.DayOfWeek != DayOfWeek.Saturday && date.DayOfWeek != DayOfWeek.Sunday)
{
allDates.Add(date);
Console.WriteLine(allDates);
}
}
int weekendCount = allDates.Count();
return weekendCount;
}
void OnDateSelected(object sender, DateChangedEventArgs e)
{
if(dateTo.Date < dateFrom.Date)
{
leaveDaysLabel.Text = "Days: Invalid Selection";
}
else if (dateTo.Date == dateFrom.Date)
{
leaveDaysLabel.Text = "Days: 1";
}
else
{
Console.WriteLine("Date From: " + dateFrom.Date);
Console.WriteLine("Date To: " + dateTo.Date);
int count = getWeekendCount(dateFrom.Date, dateTo.Date);
Console.WriteLine(count);
int days = (dateTo.Date - dateFrom.Date).Days - count;
leaveDaysLabel.Text = String.Format("Days: {0}", days);
leaveHoursLabel.Text = "Hours: " + (days * 7.4).ToString();
}
}
如果您检查 AddDays
定义,您会发现它不会修改您的变量。只有 returns 个新日期。所以你的循环会一直持续下去
所以你应该改变你的循环。一个例子
while(a.Date <= b.Date)
{
if (a.DayOfWeek != DayOfWeek.Saturday && a.DayOfWeek != DayOfWeek.Sunday)
{
allDates.Add(a);
Console.WriteLine(allDates);
}
a = a.AddDays(1);
}
此外,也许您应该只在日期 a
上调用 WriteLine
而不是整个列表。或者在循环后打印整个列表。