케이스 전환 : 하나의 숫자 대신 범위를 사용할 수 있습니까?
스위치를 사용하고 싶은데 경우가 많은데 바로 가기가 있나요? 지금까지 내가 알고 시도한 유일한 해결책은 다음과 같습니다.
switch (number)
{
case 1: something; break;
case 2: other thing; break;
...
case 9: .........; break;
}
내가 할 수 있기를 바라는 것은 다음과 같습니다.
switch (number)
{
case (1 to 4): do the same for all of them; break;
case (5 to 9): again, same thing for these numbers; break;
}
이 질문에 대한 게임에 조금 늦었지만 C # 7에 도입 된 최근 변경 사항 (Visual Studio 2017 / .NET Framework 4.6.2에서 기본적으로 사용 가능)에서는 이제 switch
문을 사용하여 범위 기반 전환이 가능 합니다.
예:
int i = 63;
switch (i)
{
case int n when (n >= 100):
Console.WriteLine($"I am 100 or above: {n}");
break;
case int n when (n < 100 && n >= 50 ):
Console.WriteLine($"I am between 99 and 50: {n}");
break;
case int n when (n < 50):
Console.WriteLine($"I am less than 50: {n}");
break;
}
메모:
- 괄호
(
및)
에 필요하지 않은when
상태이지만, 비교 (들)을 강조하기 위해 본 실시 예에서 사용된다. var
대신int
. 예 :case var n when n >= 100:
.
문제 진술에 대한 더 좋고 우아한 해결책이 있습니다.
int mynumbercheck = 1000;
// Your number to be checked
var myswitch = new Dictionary <Func<int,bool>, Action>
{
{ x => x < 10 , () => //Do this!... },
{ x => x < 100 , () => //Do this!... },
{ x => x < 1000 , () => //Do this!... },
{ x => x < 10000 , () => //Do this!... } ,
{ x => x < 100000 , () => //Do this!... },
{ x => x < 1000000 , () => //Do this!... }
};
이제 조건부 스위치를 호출하겠습니다.
myswitch.First(sw => sw.Key(mynumbercheck)).Value();
이 경우 If-else를 사용해야하지만, 어떤 이유로 든 여전히 전환이 필요한 경우 아래와 같이 할 수 있습니다. 중단이없는 첫 번째 경우는 첫 번째 중단이 발생할 때까지 전파됩니다. 이전 답변에서 제안했듯이 if-else over switch를 권장합니다.
switch (number){
case 1:
case 2:
case 3:
case 4: //do something;
break;
case 5:
case 6:
case 7:
case 8:
case 9: //Do some other-thing;
break;
}
간격은 일정합니다.
int range = 5
int newNumber = number / range;
switch (newNumber)
{
case (0): //number 0 to 4
break;
case (1): //number 5 to 9
break;
case (2): //number 10 to 14
break;
default: break;
}
그렇지 않으면:
if else
switch
범위와 함께 사용하여 "핸들"범위를 구성 할 수 있습니다 List
.
List<int> bounds = new List<int>() {int.MinValue, 0, 4, 9, 17, 20, int.MaxValue };
switch (bounds.IndexOf(bounds.Last(x => x < j)))
{
case 0: // <=0
break;
case 1: // >= 1 and <=4
break;
case 2: // >= 5 and <=9
break;
case 3: // >= 10 and <=17
break;
case 4: // >= 18 and <=20
break;
case 5: // >20
break;
}
이 접근법을 사용하면 범위가 다른 범위를 가질 수 있습니다.
언급 if-else
했듯이이 경우 범위를 처리하는 것이 더 좋습니다.
if(number >= 1 && number <= 4)
{
//do something;
}
else if(number >= 5 && number <= 9)
{
//do something else;
}
삼항 연산자를 사용하여 스위치 조건을 분류합니다.
그래서...
switch( number > 9 ? "High" :
number > 5 ? "Mid" :
number > 1 ? "Low" : "Floor")
{
case "High":
do the thing;
break;
case "Mid":
do the other thing;
break;
case "Low":
do something else;
break;
case "Floor":
do whatever;
break;
}
.Net에서는 Visual Basic에서만 switch 문에 범위를 허용하지만 C #에서는 이에 대한 유효한 구문이 없습니다.
C #에서 특정 문제를 해결하면 다음과 같이 해결할 수 있습니다.
if(number >= 1 && number <= 9) // Guard statement
{
if(number < 5)
{
// Case (1 to 4):
//break;
}
else
{
// Case (5 to 9):
//break;
}
}
else
{
// Default code goes here
//break;
}
이를 더 설명하기 위해 백분율 값이 있다고 가정합니다.
문제를 템플릿으로 사용하면 다음과 같이 보일 수 있습니다.
switch (percentage)
{
case (0 to 19):
break;
case (20 to 39):
break;
case (40 to 69):
break;
case (70 to 79):
break;
case (80 to 100):
break;
default:
break;
}
그러나 C #에서는 해당 구문을 허용하지 않으므로 다음은 C #에서 허용하는 솔루션입니다.
if (percentage >= 0 && percentage <= 100) // Guard statement
{
if (percentage >= 40)
{
if (percentage >= 80)
{
// Case (80% to 100%)
//break;
}
else
{
if (percentage >= 70)
{
// Case (70% to 79%)
//break;
}
else
{
// Case (40% to 69%)
//break;
}
}
}
else
{
if (percentage >= 20)
{
// Case (20% to 39%)
//break;
}
else
{
// Case (0% to 19%)
//break;
}
}
}
else
{
// Default code goes here
//break;
}
익숙해지는 데 약간의 시간이 걸릴 수 있지만 일단 익숙해지면 괜찮습니다.
개인적으로 범위를 허용하는 switch 문을 환영합니다.
C # 스위치 문의 미래
다음은 switch 문을 개선 할 수있는 방법에 대한 몇 가지 아이디어입니다.
버전 A
switch(value)
{
case (x => x >= 1 && x <= 4):
break;
case (x => x >= 5 && x <= 9):
break;
default:
break;
}
버전 B
switch(param1, param2, ...)
{
case (param1 >= 1 && param1 <= 4):
break;
case (param1 >= 5 && param1 <= 9 || param2 != param1):
break;
default:
break;
}
C / C ++를 사용하는 경우 "범위"구문이 없습니다. 각 "케이스"세그먼트 뒤에 모든 값을 나열 할 수 있습니다. 언어 Ada 또는 Pascal 지원 범위 구문.
First of all, you should specify the programming language you're referring to. Second, switch
statements are properly used for closed sets of options regarding the switched variable, e.g. enumerations or predefined strings. For this case, I would suggest using the good old if-else
structure.
In C# switch cases are basically dictionaries on what to do next. Since you can't look up a range in a dictionary, the best you can do is the case ... when statement Steve Gomez mentioned.
If the question was about C (you didn't say), then the answer is no, but: GCC and Clang (maybe others) support a range syntax, but it's not valid ISO C:
switch (number) {
case 1 ... 4:
// Do something.
break;
case 5 ... 9:
// Do something else.
break;
}
Be sure to have a space before and after the ...
or else you'll get a syntax error.
Through switch
case it's impossible.You can go with nested if statements.
if(number>=1 && number<=4){
//Do something
}else if(number>=5 && number<=9){
//Do something
}
You can use if-else statements with || operators (or-operator) like:
if(case1 == true || case2 == true || case3 == true)
{
Do this!...
}
else if(case4 == true || case5 == true || case6 == true)
{
Do this!...
}
else if(case7 == true || case8 == true || case9 == true)
{
Do this!...
}
참고URL : https://stackoverflow.com/questions/20147879/switch-case-can-i-use-a-range-instead-of-a-one-number
'IT박스' 카테고리의 다른 글
자바 스크립트에서 n 문자마다 문자를 삽입하려면 어떻게해야합니까? (0) | 2020.12.06 |
---|---|
Android에서 드로어 블의 이미지를 동적으로 설정하는 방법은 무엇입니까? (0) | 2020.12.06 |
여러 data.frame을 여러 Excel 워크 시트로 쉽게 내보내는 방법 (0) | 2020.12.06 |
추가 필드와 장고의 ManyToMany 관계 (0) | 2020.12.05 |
HTML5 지연 : 첫 번째 이벤트까지 유효하지 않은 의사 클래스 (0) | 2020.12.05 |