andy
andy

Reputation: 6079

Add a additional condition to Case Statement in Switch

Is it possible to add a additional Condition to Switch Statement like below in C#

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;  
 }

In above mentioned example if MyEnum = 3 then it has to be excuted if Year > 2012... Is it possible?

[EDITED]

Year > 2012 is not applicable to case 1 & case 2.

Upvotes: 16

Views: 69683

Answers (8)

eMeL
eMeL

Reputation: 377

C#7 new feature:

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;
}

Upvotes: 28

DonSleza4e
DonSleza4e

Reputation: 731

You can use C# 8 feature

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

You will have true with values 100, 200...300 and false with other values

Also you can use params:

        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
            };

in this case you will have true only if value is 100 and param is false

Upvotes: 1

Cl&#233;ment K
Cl&#233;ment K

Reputation: 71

Most of the time, I do something like that...

(sorry for the naming, the use case didn't inspire me)

Considering those private classes:

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 { }

Then you can do:

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

    case SecondNumberState _:
        // do something
        break;

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

It's easy to read even when your conditions get more complicated.

Upvotes: 0

JLRishe
JLRishe

Reputation: 101652

In order for it to work the way you've indicated with the fallthrough logic for 1 and 2, I'd suggest moving the //do something here portion out to a method or function and then doing this:

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

The other alternative would be:

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

but I think the first option is much more intuitive and readable.

Upvotes: 16

Mr Lister
Mr Lister

Reputation: 46539

Or, alternatively, you can add the condition to the switch:

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;  
 }

Upvotes: 0

Habib
Habib

Reputation: 223207

You can't add condition to a case. Case clause has to be a compile time constant. Instead you can use an if statement inside the case statement.

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

Upvotes: 1

jaket
jaket

Reputation: 9341

The answer is no.

You'll need the following:

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

Upvotes: 4

Rohit Vyas
Rohit Vyas

Reputation: 1969

You have to use the if condition inside your case , you can't use && in case statement, use like below:

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;  
 }

Upvotes: 0

Related Questions