2010-12-09 94 views
3

是否有一個較短版本的IF語句來執行此操作?C# - IF語句的較短版本

if (el.type == ElementType.Type1 || el.type == ElementType.Type2) 
+3

這不是「優化」......而且,出於好奇,如果你可以設計一個更短的版本來看起來像*任何你想要的*,它會是什麼?我很難想象如何在不丟失內容的情況下縮短時間。 – 2010-12-09 14:06:46

+4

爲什麼?這是完全簡單易懂的。爲什麼要對其進行混淆以節省幾個字節的預編譯代碼? – David 2010-12-09 14:07:05

+0

@Cody Gray:我的猜測是Gapipro會希望它看起來像這樣:if(el.type ==(ElementType.Type1 || ElementType。Type2)) – 2010-12-09 14:09:39

回答

9

你可以使用擴展方法,但這真的會好多了嗎?

拋出這樣一個靜態類:

public static bool IsOneOf(this ElementType self, params ElementType[] options) 
{ 
    return options.Contains(self); 
} 

然後你就可以這樣做:

if (el.type.IsOneOf(ElementType.Type1, ElementType.Type2)) { 

然而,這將是一個很多慢於你的if語句,因爲有一個隱式數組初始化,然後是數組遍歷,而不是(至多)兩個比較和分支。

1

請考慮的ElementType定義爲

enum ElementType 
{ 
Type1, 
Type2, 
Type3 
} 

在這種特殊情況下,你可以寫if(el.type<ElementType3) 默認類型1等於0,類型2等於1,等

0

你可以試試這個:

if(new [] { ElementType.Type1, ElementType.Type2 }.Contains(el.type)) 

(事實證明,這需要更多的字符)

0

我想你是指一個IN()子句或一些這樣的?不是真的......嗯,有點...你可以這樣做:

if ((new [] { ElementType.Type1, ElementType.Type2}).Contains(el.type)) {...} 

但是,這不會是任何接近高性能(或簡介)如你已經做什麼。你也可以做

if (el.type == ElementType.Type1 | el.type == ElementType.Type2) 

但是這並不做短路評估,所以你很少要使用那個運算符。我的建議是堅持你擁有的。

0

簡要答案是否定的。沒有C#語言結構可以讓你組合對象比較。但是,正如很多人之前提到的那樣,創建一個類型集合可能是創建較短if語句的最佳選擇。然而,這在表現方面犧牲了不少。我會堅持OR語句。

0

沒有更好的方法來優化您的代碼。正如其他用戶所示,您可以優化一個if else。

但類型if語句我曾經想過,你的情況,尤其是,將

如果(X> [Y || Z^|| A])

但是,這並不存在,並且不是作爲當前爲乾淨,如果(X> Y || X>ž|| X> A)

(這是更科迪灰色的響應)

0

簡而言之:沒有合理(在代碼可讀性和性能優化方面是合理的)。我也不會推薦這種比較的三元運算符。

如果可縮短至5個字符的實際;)

bool b = (el.type == ElementType.Type1) | (el.type == ElementType.Type2); 

if(b){...} 
0

如果這是你的代碼常見的邏輯比較,顯示了很多我只是寫來處理它的方法。

private bool isType1OrType2(ElementType type) 
{ 
    return type == ElementType.Type1 || type == ElementType.Type2; 
} 

那麼你可以做

if(isType1OrType2(el.type)) 

你也能做出這樣的擴展方法,像這樣

public static bool isType1OrType2(this ElementType type) 
{ 
    return type == ElementType.Type1 || type == ElementType.Type2; 
} 

所以代碼會讀一個更好一點

if(el.type.isType1OrType2()) 

但是,你必須有一個靜態的但是你可以決定它是否值得。除非您發現您將類型與許多不同的組合進行比較,否則我個人不會編寫一種方法來採集要比較的類型集合。如果這是你進行這種類型比較的唯一地方,我甚至不會費心改變代碼。

1

如果你只有2個值,我強烈建議使用你發佈的代碼,因爲它可能是最可讀,優雅和快速的代碼(恕我直言)。

但是,如果你有更多的情況下,這樣的和更復雜的,你可以考慮使用switch聲明:

switch (el.type) 
{ 
    case ElementType.Type1: 
    case ElementType.Type2: 
    case ElementType.Type3: 
     //code here 
     break; 
    case ElementType.Type4: 
    case ElementType.Type5: 
     //code here 
     break; 
    case ElementType.Type6: 
     //code here 
     break; 
} 

,在if statements翻譯是:

if (el.type == ElementType.Type1 || 
    el.type == ElementType.Type2 || 
    el.type == ElementType.Type3) 
{ 
    // code here 
}else if(el.type == ElementType.Type4 || 
     el.type == ElementType.Type5) 
{ 
    // code here 
}else if(el.type == ElementType.Type6) 
{ 
    // code here 
} 

他們是完美的等於我,但switch似乎更具可讀性/更清晰,並且您需要鍵入更少(即,代碼長度方面它「更短」):)

0

我不認爲有一種方法來優化您的陳述

0

不要這樣做,它是愚蠢和混亂,除非你有一個有限狀態自動機。

enum MyEnum 
{ 
    A, 
    B, 
    C 

} 
private readonly Dictionary<MyEnum, Action> _handlers = new Dictionary<MyEnum, Action> 
                 { 
    {MyEnum.A,()=>Console.Out.WriteLine("Foo")}, 
    {MyEnum.B,()=>Console.Out.WriteLine("Bar")}, 
    }; 

public static void ActOn(MyEnum e) 
{ 
    Action handler = null; 
    if (_handlers.TryGetValue(e, out handler) && handler != null) 
    { 
     handler(); 
    } 
} 
0

另一種方法是做一些按位比較,但真的不值得再次。

private void ActWithCast(MyEnum e) 
    { 
     const int interest = (int)MyEnum.A | (int)MyEnum.B; 
     if (0 != ((int)e & interest)) 
     { 
      Console.Out.WriteLine("Blam"); 
     } 
    } 
0

如果的ElementType是一個枚舉有一個較短的方式做到這一點:

[Flags] 
public enum ElementType 
{ 
    Type1 = 1, 
    Type2 = 2, 
    Type3 = 4, 
} 
... 
tElementType.HasFlag(ElementType.Type1 | ElementType.Type2); 

你不需要[旗]屬性使用HasFlag,但他們每個人的價值觀做需要遵循這種模式。