在 Switch 语句中的 Case 语句中添加额外条件

14

在C#中,是否可以像下面这样为Switch语句添加额外的条件?

switch(MyEnum)
{ 
  case 1:
  case 2:
  case 3 && Year > 2012://Additional Condtion Here
       //Do Something here..........
      break; 
  case 4:
  case 5:
       //Do Something here..........
      break;  
 }

如上例所示,如果MyEnum = 3,那么只有在Year > 2012的情况下才会执行...这是否可能?

[编辑]

对于第1种和第2种情况,Year > 2012不适用。

8个回答

25

C#7 新特性:

case...when

https://learn.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7

public static int DiceSum4(IEnumerable<object> values)
{
    var sum = 0;
    foreach (var item in values)
    {
        switch (item)
        {
            case 0:
                break;
            case int val:
                sum += val;
                break;
            case IEnumerable<object> subList when subList.Any():
                sum += DiceSum4(subList);
                break;
            case IEnumerable<object> subList:
                break;
            case null:
                break;
            default:
                throw new InvalidOperationException("unknown item type");
        }
    }
    return sum;
}

15

为了让它按照您在1和2的条件分支逻辑中指定的方式工作,我建议将//do something here 部分移到一个方法或函数中,然后这样做:

  case 1:
  case 2:
      DoSomething();
      break;
  case 3:
      if(Year > 2012) { DoSomething(); }
      break; 

另一个选择是:

  case 1:
  case 2:
  case 3:
      if (MyEnum != 3 || Year > 2012) {
         // Do something here
      }
      break; 

但我认为第一个选项更加直观和易读。


在编程中,将IF语句放在SWITCH..CASE内部是一个不好的想法,因为它们都是选择控制语句,我们不应该混合使用。 - O Thạnh Ldt

4
答案是否定的。
你需要以下内容:
switch (MyEnum)
{
   case 1:
   case 2:
       DoSomething();
       break;
   case 3:
       if (Year > 2012) DoSomething();
       break;
}

1

你不能在case语句中添加条件。Case子句必须是编译时常量。相反,你可以在case语句内部使用if语句。

case 3:
      if( > 2012)
       {
       //Do Something here..........
       }
break; 

在这种情况下,Case 1、2和Case 3的代码可能会重复。 - andy
@Anandkumar 如果>2012条件适用于许多或所有case语句,则可以在switch中包装一个if - Karthik T
@Anandkumar,首先它会比较MyEnum,如果是3,则跳转到case语句3,然后检查年份。如果您必须为所有情况检查年份,则在switch上使用if语句。 - Habib
1
@Habib的观点是,按照你目前的写法,当MyEnum为1、2或3时,>2012的检查会发生,但他只希望在MyEnum为3时才有>2012的限制。 - JLRishe

0

你必须在case语句里使用if条件,不能使用&&运算符。请按以下方式编写代码:

switch(MyEnum)
{ 
  case 1:
  case 2:
  case 3: //Additional Condtion Here
  if (Year > 2012)
  {     
      //Do Something here..........
  }
  break; 
  case 4:
  case 5:
       //Do Something here..........
      break;  
 }

1
他希望将Year > 2012仅应用于第3种情况。 - JLRishe
在您的情况下,如果(年份 > 2012) { // 在此处执行某些操作.......... } 适用于三种情况:case 1、case 2 和 case 3。 - andy

0

或者,你也可以将条件添加到开关语句中:

switch (MyEnum!=3 || Year>2012 ? MyEnum : -1)
{ 
  case 1:
  case 2:
  case 3:
       //Do Something here..........
      break; 
  case 4:
  case 5:
       //Do Something here..........
      break;  
 }

0
大多数情况下,我会做这样的事情...
(对不起,命名不太好,用例没有给我灵感)
考虑那些私有类:
private class NumberState
{
    public static NumberState GetState(int number, int year)
    {
        if (number == 1) 
            return new FirstNumberState();
        if (number == 2) 
            return new FirstNumberState();
        if (number == 3 && year > 2012) 
            return new FirstNumberState();

        if (number == 4) 
            return new SecondNumberState();
        if (number == 5) 
            return new SecondNumberState();

        return new DefaultNumberState();
    }
}

private class FirstNumberState : NumberState { }
private class SecondNumberState : NumberState { }
private class DefaultNumberState : NumberState { }

然后你可以这样做:

switch (NumberState.GetState(MyEnum, Year))
{
    case FirstNumberState _:
        // do something
        break;

    case SecondNumberState _:
        // do something
        break;

    case DefaultNumberState _:
    default:
        throw new Exception("Unhandled number state");
}

即使您的条件变得更加复杂,阅读也很容易。


0

你可以使用C# 8的功能

        public static bool SomeHelper(int value)
            => value switch
            {
                100 => true,
                var x when x >= 200 && x <= 300 => true,
                _ => false, // All other values
            };

当数值为100、200...300时,您会得到true;而其他数值则会得到false

此外,您还可以使用参数:

        public static bool SomeHelper(int value, bool param)
            => value switch
            {
                100 => true,
                var x when x >= 200 && x <= 300 && param => true,
                _ => false, // All other values
            };

在这种情况下,只有当value为100且param为false时,您才会得到true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接