IT박스

결합하는 방법 ||

itboxs 2020. 10. 13. 07:35
반응형

결합하는 방법 || 조건 문의 연산자


이 질문에 이미 답변이 있습니다.

대신에

if (foo == "1" || foo == "5" || foo == "9" ... ) 

다음과 유사하게 결합하고 싶습니다 (작동하지 않음).

if (foo == ("1" || "5" || "9" ... ))

가능합니까?


불행히도 가장 좋은 방법은 확장 방법을 만드는 것입니다.

public static bool IsOneOf<T>(this T value, params T[] options)
{
    return options.Contains(value);
}

다음과 같이 사용할 수 있습니다.

if (foo.IsOneOf("1", "5", "9"))
{
    ...
}

일반적이므로 모든 유형 (int, string 등)에 사용할 수 있습니다.


이런 식으로 할 수 없습니다. 대신 다음을 수행 할 수 있습니다.

string[] validValues = new string[] { "1", "5", "9", "whatever" };
if(validValues.Contains(foo))
{
    // do something
}

한 가지 가능한 옵션은 다음과 같습니다.

switch (foo)
{
    case "1":
    case "5":
    case "9":
        // your code here

        break;
}

또 다른 가능한 옵션은 다음과 같습니다.

var vals = new string[] { "1", "5", "9" };
if (vals.Contains(foo))
{
    // your code here
}

모든 옵션이 하나의 문자 인 경우 다음을 수행 할 수 있습니다.

if ("159".IndexOf(foo) != -1)
{
  //do something
}

또 다른 대안이 있습니다.

bool x = new[] { "1", "5", "9" }.Any(a => a == "5"); //x == true
bool y = new[] { "1", "5", "9" }.Any(a => a == "8"); //y == false

.Contains(foo)람다의 유연성이 여기서 낭비되기 때문에이 경우 에 사용하는 것이 좋습니다 . 수행해야하는 복잡한 표현이 있다면 Any가 더 유용 할 것입니다.


허용되는 경우이를 수행 할 수 있습니다.

if ( (new string[] {"1","9","5","6" }).Contains(foo))
{

}

다음 switch문장을 사용할 수 있습니다 .

switch (foo) {
    case "1":
    case "5":
    case "9":
        // ...
        break;
    case "2":
    case "4":
        // ...
        break;
}

경우 foo대소 문자 구분에 문자열,주의를 기울입니다.


if 조건이 여러 개인 경우 컴파일러가 속도를 높이기 위해 가능한 한 점프 테이블 을 생성 하므로 항상 switch 문 사용을 고려해야 합니다. 당신은 살펴 보셔야 여기에 속도 테스트를 위해. 여기서 주목할 점은 조건 수가 오버 헤드를 감당할만큼 충분히 크면 C # 컴파일러가 HashTable 개체도 생성한다는 것입니다.

따라서 이것이 더 나은 접근 방식입니다.

switch (foo) {
case "1":
case "5":
case "9":
    // ...
    break;
case "2":
case "4":
    // ...
    break;
}

참고 URL : https://stackoverflow.com/questions/17815728/how-to-combine-operators-in-condition-statement

반응형