如何执行while循环给定次数?

时间:2019-09-10 12:47:57

标签: c# winforms while-loop

我有一个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循环时出错。

3 个答案:

答案 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));