在C#中评估交换机语句中的表达式

pri*_*kar 45 c# switch-statement

我必须在switch声明中实现以下内容:

switch(num)
{
  case 4:
    // some code ;
    break;
  case 3:
    // some code ;
    break;
  case 0:
    // some code ;
    break;
  case < 0:
    // some code ;
    break;
}
Run Code Online (Sandbox Code Playgroud)

可以对switch语句进行评估case < 0吗?如果没有,我怎么能这样做?

Jon*_*eet 70

你不能 - 切换/案例仅适用于个别值.如果要指定条件,则需要"if":

if (num < 0)
{
    ...
}
else
{
    switch(num)
    {
        case 0: // Code
        case 1: // Code
        case 2: // Code
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 甚至切换(num){案例0:案例1:默认:if(num <0){..}} (24认同)
  • @roe:是的,我考虑过给这个表格.尽管时间不过:) (2认同)

Max*_*Max 44

我知道这个话题已经很老了,但如果有人在C#7中仍然在寻找答案,那么这是可能的.这是一个例子:

switch (value)
{
     case var expression when value < 0:
         //some code
         break; 

     case var expression when (value >= 0 && value < 5):
         //some code
         break;

     default:
         //some code
         break;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果`expression`没用,你可以在c#7上用`_`替换`expression`. (4认同)
  • @PoyChang我不会称之为无用的,我会称其为更可维护的,任何不知道该语法的人都可以在其表示可维护性时得出其含义,但是当它是一个下划线时,会失去一些含义。 (2认同)
  • @HughWood使用下划线的意思是暗示该变量是无意义的,因此不会失去任何意义。例如,不需要参数时,可以将其用作Func &lt;TParam,TResult&gt;的参数。_ =&gt; true,或者在这种情况下,如果该变量与另一个变量是冗余的,则使用这两个变量将很难维护。 (2认同)
  • 这是可维护性降低的一个完美例子,使用它会导致浪费时间来理解它的含义,因为它现在和现在都没有被普遍使用,而且入门级和高级开发人员之间的知识差距相当广泛,正是这样的糖让企业付出了金钱的代价。因此,它的可维护性较差,其中变量名称清晰,代码注释正确。在许多扩展中引入过度简化的代码纯粹是不可维护的代码的定义。 (2认同)

Ada*_*ent 22

在 C# 命运的转折中,这种情况又回来了。如果您升级到 C# 9.0,您原来的 switch 语句现在将可以编译!C#9.0 在一般模式匹配中添加了关系模式,其中包括 switch 语句。

您现在可以做一些非常时髦的事情,如下所示:

      var num = new Random().Next();
      
      switch(num)
      {
        case < 0:
          // some code ;
          break;
        case 0:
          // some code ;
          break;
        case > 0 and < 10:
          // some code ;
          break;
        case > 20 or (< 20 and 15):
          // some code ;
          break;
      }
Run Code Online (Sandbox Code Playgroud)

请注意在最后一种情况下使用文字“and”和“or”,以允许 && 和 || 输入要编译的表达式。

要使用 C# 9,请确保在属性组中的 csproj 文件中将 XmlNode LangVersion 设置为最新或 9.0

例如

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <Platforms>AnyCPU;x86</Platforms>
    <Configurations>Debug;Release;Mock</Configurations>
    <LangVersion>Latest</LangVersion>
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)


tbr*_*fni 13

您可以在switch语句的末尾执行类似的操作:

default:
    if(num < 0)
    {
        ... // Code
    }
    break;
Run Code Online (Sandbox Code Playgroud)


que*_*en3 9

如果你的num不能小于零:

public int GetSwitch(int num) { return num < 0 ? -1 : num; }
switch(GetSwitch(num))
{
case 4: // some code ; break;
case 3:// some code ; break;
case 0: // some code ; break;
case -1 :// some code ; break;
}
Run Code Online (Sandbox Code Playgroud)

如果可以,请使用其他"不存在"的数字,例如int.MinValue.

  • DRY当然是好的,但实际上重复"GetSwitch(num)"比num <0?-1更重复:num(这是两个字符少)... :)所有的笑话放在一边,我认为在这种情况下,不是让GetSwitch的结果立即可以降低(例如,如果你在其他地方也使用它)伤害不仅仅是帮助.但那只是MHO. (2认同)

MrV*_*ype 9

进入2021年。

var res = num switch
{
    4 => "It's four",
    3 => "It's three",
    0 => "It's zero",
    < 0 => "It's negative",
    _ => "It's something else"
};
Run Code Online (Sandbox Code Playgroud)

繁荣。

(公平地说,switch 表达式是 C# 8.0 的一项功能,所以不是真正的 2021 年。但似乎仍然很少有人知道它。)


Cat*_*peg 8

你可以这样做

switch (mark)
        {
            case int n when n >= 80:
                Console.WriteLine("Grade is A");
                break;

            case int n when n >= 60:
                Console.WriteLine("Grade is B");
                break;

            case int n when n >= 40:
                Console.WriteLine("Grade is C");
                break;

            default:
                Console.WriteLine("Grade is D");
                break;
        }
Run Code Online (Sandbox Code Playgroud)

  • 很高兴我一直在滚动!好的! (4认同)
  • 您能否添加一个指向模式匹配文章的链接,并且该链接是在 C# 7 中发布的(比发布答案晚得多)? (3认同)

Max*_*erl 5

无论你想要与否,你都必须使用.Switch只能将您的值与常量值进行比较.

  • 挑剔一点,说“常量值(文字)”是错误的。直到括号里,你都做得很好。括号暗示“文字”和“常量值”是*同义词*,而实际上文字常量是常量值的*子集*。所有文字都是常量,但并非所有常量都是文字。switch 语句需要常量,但不需要文字。 (2认同)

Oli*_*ppi 5

我能想到的唯一方法(我真的不推荐它)如下:

int someValue;

switch (Math.Max(someValue, -1))
{
    case -1:
        // will be executed for everything lower than zero.
        break;

    case 0:
       // will be executed for value 0.
       break;

    case 1:
       // will be executed for value 1.
       break;

    default:
       // will be executed for anything else.
       break;
}
Run Code Online (Sandbox Code Playgroud)