switch 문의 여러 사례 사례 진술을 겪을 수있는

case value:반복해서 진술하지 않고 여러 사례 진술을 겪을 수있는 방법이 있습니까?

나는 이것이 효과가 있다는 것을 안다.

switch (value)
{
   case 1:
   case 2:
   case 3:
      // Do some stuff
      break;
   case 4:
   case 5:
   case 6:
      // Do some different stuff
      break;
   default:
       // Default stuff
      break;
}

하지만 다음과 같이하고 싶습니다.

switch (value)
{
   case 1,2,3:
      // Do something
      break;
   case 4,5,6:
      // Do something
      break;
   default:
      // Do the Default
      break;
}

이 언어가 다른 언어에서 생각하고 있습니까, 아니면 뭔가 빠졌습니까?



답변

언급 한 두 번째 방법에 대한 C ++ 또는 C #에는 구문이 없습니다.

첫 번째 방법에는 아무런 문제가 없습니다. 그러나 범위가 매우 큰 경우 일련의 if 문을 사용하십시오.


답변

나는 이것이 이미 대답했다고 생각합니다. 그러나 다음을 수행하여 두 옵션을 구문 적으로 더 나은 방식으로 혼합 할 수 있다고 생각합니다.

switch (value)
{
    case 1: case 2: case 3:
        // Do Something
        break;
    case 4: case 5: case 6:
        // Do Something
        break;
    default:
        // Do Something
        break;
}

답변

이 구문은 Visual Basic Select … Case Statement 에서 가져온 것입니다 .

Dim number As Integer = 8
Select Case number
    Case 1 To 5
        Debug.WriteLine("Between 1 and 5, inclusive")
        ' The following is the only Case clause that evaluates to True.
    Case 6, 7, 8
        Debug.WriteLine("Between 6 and 8, inclusive")
    Case Is < 1
        Debug.WriteLine("Equal to 9 or 10")
    Case Else
        Debug.WriteLine("Not between 1 and 10, inclusive")
End Select

C #에서는이 구문을 사용할 수 없습니다. 대신 첫 번째 예제의 구문을 사용해야합니다.


답변

C # 7 (Visual Studio 2017 / .NET Framework 4.6.2에서 기본적으로 사용 가능)에서는 이제 switch 문 으로 범위 기반 전환이 가능 하며 OP 문제에 도움이됩니다.

예:

int i = 5;

switch (i)
{
    case int n when (n >= 7):
        Console.WriteLine($"I am 7 or above: {n}");
        break;

    case int n when (n >= 4 && n <= 6 ):
        Console.WriteLine($"I am between 4 and 6: {n}");
        break;

    case int n when (n <= 3):
        Console.WriteLine($"I am 3 or less: {n}");
        break;
}

// Output: I am between 4 and 6: 5

노트:

  • 괄호 ()에 필요하지 않은 when상태이지만, 비교 (들)을 강조하기 위해 본 실시 예에서 사용된다.
  • var대신에 사용될 수도 있습니다 int. 예를 들면 다음과 같습니다 case var n when n >= 7:..

답변

다음과 같은 줄 바꿈을 생략 할 수 있습니다.

case 1: case 2: case 3:
   break;

그러나 나는 그 나쁜 스타일을 고려합니다.


답변

.NET Framework 3.5의 범위는 다음과 같습니다.

MSDN의 열거 가능 범위

SWITCH 문은 “==”연산자를 사용한다고 말했듯이 “contains”및 IF 문과 함께 사용할 수 있습니다.

예를 들면 다음과 같습니다.

int c = 2;
if(Enumerable.Range(0,10).Contains(c))
    DoThing();
else if(Enumerable.Range(11,20).Contains(c))
    DoAnotherThing();

그러나 나는 우리가 더 재미있을 수 있다고 생각합니다 : 반환 값이 필요하지 않으며이 동작에는 매개 변수가 없으므로 쉽게 동작을 사용할 수 있습니다!

public static void MySwitchWithEnumerable(int switchcase, int startNumber, int endNumber, Action action)
{
    if(Enumerable.Range(startNumber, endNumber).Contains(switchcase))
        action();
}

이 새로운 방법을 사용한 예 :

MySwitchWithEnumerable(c, 0, 10, DoThing);
MySwitchWithEnumerable(c, 10, 20, DoAnotherThing);

값이 아닌 동작을 전달하므로 괄호를 생략해야합니다. 매우 중요합니다. 인수가있는 함수가 필요한 경우 유형을 Action로 변경하십시오 Action<ParameterType>. 반환 값이 필요한 경우을 사용하십시오 Func<ParameterType, ReturnType>.

C # 3.0 에서는 case 매개 변수가 동일하다는 사실을 캡슐화 하기 쉬운 Partial Application 이 없지만 약간의 도우미 메서드 (bit verbose, tho)를 만듭니다.

public static void MySwitchWithEnumerable(int startNumber, int endNumber, Action action){
    MySwitchWithEnumerable(3, startNumber, endNumber, action);
}

다음은 새로운 함수형 반 입문이 이전 명령형 문보다 IMHO가 더 강력하고 우아하다는 예입니다.


답변

완벽한 C # 7 솔루션은 다음과 같습니다.

switch (value)
{
   case var s when new[] { 1,2,3 }.Contains(s):
      // Do something
      break;
   case var s when new[] { 4,5,6 }.Contains(s):
      // Do something
      break;
   default:
      // Do the default
      break;
}

문자열에서도 작동합니다 …

switch (mystring)
{
   case var s when new[] { "Alpha","Beta","Gamma" }.Contains(s):
      // Do something
      break;
...
}