2012-07-05 34 views
3

我經常發現自己寫條件語句類似以下內容:C#語法糖類似於SQL的IN比較?

if(Path.GetExtension(filename) == ".pdf" || Path.GetExtension(filename)== ".doc") 
{ 
    // do something 
} 

調用Path.GetExtension()每一次每一個文件擴展名我要測試似乎有點多餘。當然,我可以做這樣的事情:

string fileExtension = Path.GetExtension(filename); 
if(fileExtension == ".pdf" || fileExtension == ".doc") 
{ 
    // do something 
} 

但考慮到我只使用了比較,並沒有別的fileExtension,宣佈爲文件擴展名的變量似乎並不很優雅。

在SQL中,我可以使用IN操作符:

SELECT file FROM table WHERE fileExtension IN(".pdf", ".doc") 

,讓我沒有任何重複進行測試。

C#是否提供類似於SQL中的任何語法糖,在哪裏我不必重複被比較的變量或相等運算符?

回答

8

只需創建一個新的陣列內聯和調用Contains

if((new[]{ ".pdf", ".doc"}).Contains(fileExtension)) 
{ 
    // Do Something 
} 
+0

我期待着這樣的事情。我認爲爲了比較而必須實例化一個新數組是有點不幸的,但這確實表達了這個意圖。 – Andrew 2012-07-05 18:28:50

1

Justin的答案肯定會做到這一點。但似乎對我來說過分了。當然,除非你已經有一個擴展,你在集合中進行比較,看起來效率會比直接比較它們的效率要差一些,就像你在第二個例子中做的那樣。 (你的第一個例子是一個不好的辦法國際海事組織。)

但請注意,結果存儲在一個變量,就像你在第二個例子中做的那樣可能是非常有效的。如果變量僅用於後面的比較,編譯器可以進行各種優化。它甚至可能根本不需要創建變量。

+1

這段代碼不太可能是性能至關重要的,因此在選擇代碼時可讀性是最重要的。國際海事組織,當有超過兩個或三個擴展,陣列顯然更好。 – CodesInChaos 2012-07-05 18:26:11

+0

給出的示例沒有超過兩個或三個擴展。如果我正在寫這篇文章並且不止一對,我也會使用一個集合。但是我會事先定義它,可能是一個靜態成員,並且不會在每次進行比較時創建它。每次比較時重新創建集合,並將它作爲比較語句的一部分看起來既不可讀也不表現。 – 2012-07-05 18:27:45

3

如果你關心的可讀性,你可以走了

switch (fileExtension) 
{ 
    case ".pdf": 
    case ".doc": 
     // do something     
     break; 
} 

,也是面向未來的情況下,你必須以不同的方式處理其他的一些推廣。

0

如果您確實希望它像SQL運算符那樣讀取,則可以使用擴展方法。

public static bool In(this object o, IEnumerable c) 
{ 
    foreach (object i in c) 
    { 
     if (i.Equals(o)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

用法:

string fileExtension = ".pdf"; 
string[] acceptedFileExtensions = new[] { ".pdf", ".doc" }; 

if (fileExtension.In(acceptedFileExtensions)) 
{ 
    // Do something 
} 
1

當我看到你接受的解決辦法了,我想提交我的,因爲我覺得它遵循你的意圖更加緊密。

public static bool In(this object source, params object[] collection) 
{ 
    return collection.Contains(source); 
} 

用法:

if(Path.GetExtension(filename).In(".pdf", ".doc")) 
{ 
    //Do something 
} 

希望有所幫助。

編輯:添加句點到文件擴展名,以準確反映「GetExtension」的功能。

+0

謝謝。這很酷且簡潔。只需要提一點,Path.GetExtension(string)包含前導'。',所以它應該是Path.GetExtension(filename).In(「。pdf」,「.doc」)。我試圖編輯,但它不會讓我保存,因爲編輯至少有6個字符。 – Andrew 2012-08-01 19:35:23

+0

啊,我明白了。您可以在底部添加一個「編輯記事」,描述您爲超過6個字符限制所做的修改。我會編輯我的答案以反映它。 – Thebigcheeze 2012-08-01 23:12:22