【问题标题】:How to execute while loop given number of times?如何执行给定次数的while循环?
【发布时间】:2020-01-12 05:35:49
【问题描述】:

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

【问题讨论】:

  • 考虑使用for 而不是while。并确保return for / while 之后有一个while
  • for (; weekendDays.Contains(date.DayOfWeek) || holidayDates.Contains(date); date = date.AddDays(1)); 然后return date;
  • 该错误是因为您在 while 循环之后没有包含 return 语句。看起来这是一个永远不会被执行的地方,但它可以(比如在异常的情况下。
  • 如果可以提前计算出重复次数,使用for。如果您不知道有多少,请使用while
  • @DmitryBychenko 我应该如何处理输入?在我的代码中,i=count, sayi=从文本框中输入数字。

标签: c# winforms while-loop


【解决方案1】:

while 是一个条件循环。在这里,您在子句中放置一个非条件并立即跟进一个条件。将条件放在while子句中:

while(weekendDays.Contains(date.DayOfWeek) || holidayDates.Contains(date)) {
    date = date.AddDays(1);
}

return date;

您收到错误的实际原因是编译器无法预测您的 if 条件是否会解析为 false。如果没有,那么您的函数将永远不会返回。

使用修改后的while循环,这可能仍然会发生,但它会导致无限循环,如果你这样打自己的脚,编译器就可以了。

【讨论】:

    【解决方案2】:

    您可以更改 else 子句以跳出循环。然后退出循环。

            while (true)
            {
                if (weekendDays.Contains(date.DayOfWeek) || 
                          holidayDates.Contains(date))
                    date = date.AddDays(1);
                else
                    break;
            }
            return date;
    

    【讨论】:

      【解决方案3】:

      让我们来看看GetNextWeekDay(如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));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多