我有一个while循环来获取下一个工作日(节假日和星期日除外)。 但它是通过加上1天来计算的。我希望该天数由用户确定。我从下面的 TextBox (TboxIzin)获取输入。
如何执行while循环以进行给定次数的计算?
int i = 1;
int sayi;
IzinIslem i1 = new IzinIslem();
int.TryParse(i1.TboxIzin.Text, out sayi);
public static DateTime GetNextWeekDay(DateTime date,
IList<Holiday> holidays, IList<DayOfWeek> weekendDays)
{
int i = 1;
int sayi;
IzinIslem i1 = new IzinIslem();
int.TryParse(i1.TboxIzin.Text, out sayi);
// always start with tomorrow, and truncate time to be safe
date = date.Date.AddDays(1);
// calculate holidays for both this year and next year
var holidayDates = holidays.Select(x => x.GetDate(date.Year))
.Union(holidays.Select(x => x.GetDate(date.Year + 1)))
.Where(x => x != null)
.Select(x => x.Value)
.OrderBy(x => x).ToArray();
// increment to get working day
while (true)
{
if (weekendDays.Contains(date.DayOfWeek) ||
holidayDates.Contains(date))
date = date.AddDays(1);
else
return date;
}
}
我得到not all code paths return a value
当我尝试嵌套while循环时出错。
答案 0 :(得分:5)
while是一个条件循环。在这里,您将非条件放在子句中,并立即跟进条件。将条件放在while子句中:
while(weekendDays.Contains(date.DayOfWeek) || holidayDates.Contains(date)) {
date = date.AddDays(1);
}
return date;
出现错误的实际原因是编译器无法预测if条件是否会解析为false。如果没有,那么您的函数将永远不会返回。
使用修改后的while循环,这仍然可能发生,但是它将导致无限循环,如果您以这种方式射击自己,编译器就可以了。
答案 1 :(得分:1)
您可以更改"red" "green" "blue"
子句以打破循环。然后退出循环。
else
答案 2 :(得分:1)
让我们来了解GetNextWeekDay
中的所有UI(例如int.TryParse(i1.TboxIzin.Text, out sayi);
):
public static DateTime GetNextWeekDay(DateTime date,
IEnumerable<Holiday> holidays,
IEnumerable<DayOfWeek> weekendDays) {
// public method arguments validation
if (null == holidays)
throw new ArgumentNullException(nameof(holidays));
else if (null == weekendDays)
throw new ArgumentNullException(nameof(weekendDays));
HashSet<DayOfWeek> wends = new HashSet<DayOfWeek>(weekendDays);
// Current Year and Next years - .AddYear(1)
HashSet<DateTime> hds = new HashSet<DateTime>(holidays
.Select(item => item.Date)
.Concate(holidays.Select(item => item.Date.AddYear(1))));
for (var day = date.Date.AddDays(1); ; day = day.AddDays(1))
if (!wends.Contains(day.DayOfWeek) && ! hds.Contains(day))
return day;
}
或者,如果您更喜欢 Linq ,则可以将循环重写为
return Enumerable
.Range(1, 1000)
.Select(day => date.Date.AddDays(day))
.TakeWhile(item => item.Year - date.Year <= 1)
.First(item => !wends.Contains(item.DayOfWeek) && !hds.Contains(item));