将if else重写为switch

本文关键字:switch 重写 else if | 更新日期: 2023-09-27 18:07:09

我写了一些if-else语句,像这样:

   if (workedDays > 0 && workedDays <= 180)
   {
     x= 14;
   }
   if (workedDays > 180 && workedDays <= 540)
   {
     x= 28;
   }
   if (workedDays > 540 && workedDays <= 1068)
   {
     x= 42;
   }
   else
   {
     x= 56;
   }

我试图将其重写为switch语句,如下所示:

   switch (workedDays)
   {
     case (workedDays > 0 && workedDays <= 180):
       x=14;
       break;
     default:
       break;
   }

然而,我得到错误Cannot implicitly convert type 'bool' to 'int' .

我该如何修复它?

将if else重写为switch

虽然@Jeroen的switch(true)答案可能有效,但为了可读性,我建议如下:

if (workedDays <= 180)
    x = 14;
else if (workedDays <= 540)
    x = 28;
else if (workedDays <= 1068)
    x = 42;
else 
    x = 56;

使用else if结构,不需要对最小值和最大值进行双重检查。

嗯,我个人不喜欢有这么多的"如果,否则"。

我通常遵循"三个或更多,使用一个for!"

所以,我要这样做:-

class Program
{
  struct Data
  {
    public Data (int l, int u, int v)
    {
      lower = l;
      upper = u;
      value = v;
    }
    public int lower;
    public int upper;
    public int value;
  }
  static void Main (string [] args)
  {
    Data []
      // at the moment, this is coded into the source
      // it can be read from a file at run time instead
      data = { new Data (0, 180, 14), new Data (180, 540, 28), new Data (540, 1068, 42) };
    int
      // again, the default case is hard coded, it too can be loaded from a file
      x = 56,
      workedDays = 100;
    foreach (Data item in data)
    {
      if (workedDays > item.lower && workedDays <= item.upper)
      {
        x = item.value;
        break;
      }
    }
  }
}

然后您可以从文件中填充数据数组,这样搜索就可以在运行时配置,这样您就不需要重新构建程序来更改范围和结果。

如果你考虑一下你要求编译器做什么,你就会明白为什么你会有问题。

你正在切换workkeddays,这可能是一个int类型:

switch(workedDays:int)
{
   case (workedDays > 0 && workedDays <= 180):
   break;
}

你已经得到了你的情况,被评估为真或假的结果(bool),所以你要求它在整数之间选择,但给它一个bool作为一种可能性!

你不能。Switch语句只能与编译时常量一起使用。参见这个问题

do:

switch (true)
    {
        case (workedDays > 0 && workedDays <= 180):
            x=14;
            break;
        default:
            break;
    }