是否有一個較短版本的IF語句來執行此操作?C# - IF語句的較短版本
if (el.type == ElementType.Type1 || el.type == ElementType.Type2)
是否有一個較短版本的IF語句來執行此操作?C# - IF語句的較短版本
if (el.type == ElementType.Type1 || el.type == ElementType.Type2)
你可以使用擴展方法,但這真的會好多了嗎?
拋出這樣一個靜態類:
public static bool IsOneOf(this ElementType self, params ElementType[] options)
{
return options.Contains(self);
}
然後你就可以這樣做:
if (el.type.IsOneOf(ElementType.Type1, ElementType.Type2)) {
然而,這將是一個很多慢於你的if語句,因爲有一個隱式數組初始化,然後是數組遍歷,而不是(至多)兩個比較和分支。
請考慮的ElementType定義爲
enum ElementType
{
Type1,
Type2,
Type3
}
在這種特殊情況下,你可以寫if(el.type<ElementType3)
默認類型1等於0,類型2等於1,等
你可以試試這個:
if(new [] { ElementType.Type1, ElementType.Type2 }.Contains(el.type))
(事實證明,這需要更多的字符)
我想你是指一個IN()子句或一些這樣的?不是真的......嗯,有點...你可以這樣做:
if ((new [] { ElementType.Type1, ElementType.Type2}).Contains(el.type)) {...}
但是,這不會是任何接近高性能(或簡介)如你已經做什麼。你也可以做
if (el.type == ElementType.Type1 | el.type == ElementType.Type2)
但是這並不做短路評估,所以你很少要使用那個運算符。我的建議是堅持你擁有的。
簡要答案是否定的。沒有C#語言結構可以讓你組合對象比較。但是,正如很多人之前提到的那樣,創建一個類型集合可能是創建較短if語句的最佳選擇。然而,這在表現方面犧牲了不少。我會堅持OR語句。
沒有更好的方法來優化您的代碼。正如其他用戶所示,您可以優化一個if else。
但類型if語句我曾經想過,你的情況,尤其是,將
如果(X> [Y || Z^|| A])
但是,這並不存在,並且不是作爲當前爲乾淨,如果(X> Y || X>ž|| X> A)
(這是更科迪灰色的響應)
簡而言之:沒有合理(在代碼可讀性和性能優化方面是合理的)。我也不會推薦這種比較的三元運算符。
如果可縮短至5個字符的實際;)
bool b = (el.type == ElementType.Type1) | (el.type == ElementType.Type2);
if(b){...}
如果這是你的代碼常見的邏輯比較,顯示了很多我只是寫來處理它的方法。
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())
但是,你必須有一個靜態的但是你可以決定它是否值得。除非您發現您將類型與許多不同的組合進行比較,否則我個人不會編寫一種方法來採集要比較的類型集合。如果這是你進行這種類型比較的唯一地方,我甚至不會費心改變代碼。
如果你只有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
似乎更具可讀性/更清晰,並且您需要鍵入更少(即,代碼長度方面它「更短」):)
我不認爲有一種方法來優化您的陳述
不要這樣做,它是愚蠢和混亂,除非你有一個有限狀態自動機。
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();
}
}
另一種方法是做一些按位比較,但真的不值得再次。
private void ActWithCast(MyEnum e)
{
const int interest = (int)MyEnum.A | (int)MyEnum.B;
if (0 != ((int)e & interest))
{
Console.Out.WriteLine("Blam");
}
}
如果的ElementType是一個枚舉有一個較短的方式做到這一點:
[Flags]
public enum ElementType
{
Type1 = 1,
Type2 = 2,
Type3 = 4,
}
...
tElementType.HasFlag(ElementType.Type1 | ElementType.Type2);
你不需要[旗]屬性使用HasFlag,但他們每個人的價值觀做需要遵循這種模式。
這不是「優化」......而且,出於好奇,如果你可以設計一個更短的版本來看起來像*任何你想要的*,它會是什麼?我很難想象如何在不丟失內容的情況下縮短時間。 – 2010-12-09 14:06:46
爲什麼?這是完全簡單易懂的。爲什麼要對其進行混淆以節省幾個字節的預編譯代碼? – David 2010-12-09 14:07:05
@Cody Gray:我的猜測是Gapipro會希望它看起來像這樣:if(el.type ==(ElementType.Type1 || ElementType。Type2)) – 2010-12-09 14:09:39