2012-01-05 5 views
15

가능한 중복 : 변수가 A 또는 B 중 하나가 될 수있는
C# if statements matching multiple values단순화 경우 (X == 1 || X == 2)

가 나는 종종 코드를 작성하는 자신을 발견 예를 들어 나는 중계기에 OnItemDataBound 호출 할 때 :

그때 나는 종종 생각
protected void repeater_OnItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    {} 
} 

는이 일을 간단한 방법이 있어야합니다. 나는 다음과 같이 쓰고 싶다 :

if(x == (1 || 2)) 

SQL은 IN (..) 연산자를 가지고 있는데, C#과 비슷한 것이 있는가?

WHERE x IN(1,2) 

스위치 명령문을 대신 사용할 수는 있지만 간단하지는 않습니다. 가능하다면 If 문에서이 작업을 수행하기를 원합니다.

+0

가장 읽기 쉬운 방법은 'if'입니다. 가장 빠른 방법 : 아마도 '전환'. 문제를 해결하는 구문 : COBOL : D –

+0

if (e.Item.DataItem == null)'if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==) 대신'if (e.Item.DataItem == null) ListItemType.AlternatingItem)'는 리피터를 바인드 할 때 작성하기가 쉽습니다. –

답변

7

SQL IN 문을 모방하려는 경우 다음과 같은 작업을 수행 할 수 있습니다. 2 개 항목이있는 단순한 경우에 이것은 아마도 단순하지는 않지만 더 많은 항목에 대해서는 분명히 있습니다.

(new[] { 1, 2 }).Contains(x); 
15

나는 괜찮다고 생각합니다. 그러나, 당신은 같은 것을 할 수있는 :

// note the array is actually mutable... just... don't change the contents ;p 
static readonly ListItemType[] specialTypes = 
    new[]{ListItemType.Item, ListItemType.AlternatingItem}; 

및 체크 대상 :

if(specialTypes.Contains(e.Item.ItemType)) { 
    // do stuff 
} 

그러나 강조하기 : 나는 실제로 단지 정수 및 열거 형에 switch로, 여기에 switch를 사용하는 거라고하는 것은 특별한 IL 처리가 있습니다 점프 테이블을 통해, 그것은 매우 효율적 :

switch(e.Item.ItemType) { 
    case ListItemType.Item: 
    case ListItemType.AlternatingItem: 
     // do stuff 
     break; 
} 
+1

switch 문의 +1입니다. 나는 일반적으로 이것을 사용했습니다. 일반적으로 Item 또는 AlternatingItem (예 : 바닥 글 또는 머리글)을 처리 할 때 사용되었지만, if 문을 작성하는 것보다 때때로 더 깨끗한 것처럼 사용했습니다. –

0

너무 가능한 옵션 F 더 존재하지 않는 또는 단일 if, 귀하의 코드를 읽을 수 있으며 지우기, 가장 중요합니다.

당신이 더 많은 3 조건 자주 대회 if, 당신은

new List<..>{ condition1, condition2, ... ConditionN}.Any<>()를 사용 할 수 있습니다.

이런 식으로.

12

는이 같은 확장 메서드를 작성할 수

public static bool In<T>(this T x, params T[] values) 
{ 
    return values.Contains(x); 
} 

을 그리고 다음과 같이 호출 :

1.In(2,3,4) 

그러나 나는 그것이 노력이 가치가 없어 말할 것입니다.

+7

흥미로운 apporach 'return values.Contains (x);로 더 짧게 쓸 수있다. – martinstoeckli

1

는이 같은 this Answer

public static bool In<T>(this T source, params T[] list) 
{ 
    if(null==source) throw new ArgumentNullException("source"); 
    return list.Contains(source); 
} 

전화에서 볼 수있는 다음과 같은 방법을 사용할 수 있습니다

if(x.In(1,2,4)) 
{ 
     // ... 
} 
0

나는 당신이 얻을 예정으로 그 단순한 생각합니다. 다른 답변이나 자신의 제안조차 실제로 사소한 부분을 줄이기 위해 특수 구조와 해결 방법을 사용하는 방법에 유의하십시오. 또한 이러한 현명한 해결 방법으로 인해 성능이 저하 될 수 있습니다.

하지만 많은 공간을 사용하는 2 ~ 3 개의 항목에 대해서는 후속 줄에 조건을 넣어 읽기가 좀 더 쉬워 지도록하겠습니다.

if (x == MyEnum.SomeReallyLongNameThatEatsUpTheLine || 
    x == MyEnum.TheOtherNameThatWastesSpace) 
{ 
// The simplest code. 
} 

가능한 값이 매우 길면 배열 방식이 훨씬 좋습니다.

관련 문제