2012-01-05 42 views
15

可能重複:
C# if statements matching multiple values簡化如果(X == 1 || X == 2)

我經常發現自己編寫代碼,其中的變量可以是A或B ,例如,當我打電話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) 

我知道我可以使用switch語句來代替,但那不夠簡單。如果可能的話,我希望它在If語句中完成。

+0

最可讀的方式:'if'。最快的方法:可能是「切換」。解決問題的語法:COBOL:D – 2012-01-05 13:50:17

+0

'if(e.Item.DataItem == null)return;'instead of'if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)'當綁定中繼器時更容易編寫。 – 2013-07-02 06:48:37

回答

7

如果你想模仿SQL IN語句你可以做這樣的事情......對於有兩個項目的簡單情況,這可能並不簡單,但對於更多的項目,它肯定會是。

(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,比如Footer或Header,但是我剛剛使用它,因爲它有時比編寫if語句更清晰。 – 2012-01-05 13:55:08

0

,除非沒有太多可能˚F選項或單個if,您的代碼是可讀的,並且明確,這是最重要的。

如果經常滿足if有更多的3條件下,可以使用

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,你可以用'返回values.Contains(x);'來寫得更短 – martinstoeckli 2012-01-05 13:49:50

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

我認爲這很簡單,只要你會得到什麼。注意其他答案或甚至你自己的建議實際上是如何使用特殊的構造和解決方法來縮短一些簡單的語法。而且,這些聰明的解決方法會妨礙性能。

但是,對於使用大量空間的兩到三個項目,我喜歡將條件放在後續行中以使讀取更容易一些。

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

我想如果你有一個很長的可能值列表數組方法是好得多。

相關問題