2017-04-05 37 views
2

您有避免執行多個String.Equals的想法嗎? 例如:C# - 將一個字符串變量與多個其他字符串進行比較(String.Equals)

if (interSubDir.Equals("de") || interSubDir.Equals("de-DE")) 

謝謝!

+1

您可以創建一個字符串文字集合並檢查該集合是否包含'interSubDir'。 – David

+1

您將不得不在每個目標點進行比較,無論是循環還是單獨。你只是想讓它更具可讀性嗎? –

+0

通常,當你檢查X是否等於A,B,C,D等時,你必須檢查每一個。沒有真正的捷徑。有時候,你可以把事情組合成一個數組,並使用'Any'來執行檢查,但是如果你所做的取決於你正在檢查的內容,那對你無能爲力。 – Will

回答

2

創造價值的集合:

string[] values = { "de", "de-DE" }; 

使用Contains方法:

if (values.Contains(interSubDir)) 

它提供了O(n)性能。

如果您的收藏非常大,那麼您可以使用Array.BinarySearch方法,即爲您提供O(log n)性能。

if (Array.BinarySearch(values, interSubDir) >= 0) 

但是,該集合必須先排序。

Array.Sort(values); 
0

Linq可以幫你。 listToChechAgainst可能是簡單的變量或私人/公共財產。如下

public static class StringExt 
{ 
    public static bool EqualsAnyOf(this string value, params string[] targets) 
    { 
     return targets.Any(target => target.Equals(value)); 
    } 
} 

,您可以使用:

var listToChechAgainst = new[] { "de", "DE-de" }; 

if(listToChechAgainst.Any(x => innerSubDir.Equals(x))); 
3

如果你只是想使其更具可讀性,或者需要較少的打字,你可以寫一個字符串擴展方法,像這樣

if (interSubDir.EqualsAnyOf("de", "de-DE")) 

或者

if (interSubDir.EqualsAnyOf("de", "de-DE", "en", "en-GB", "en-US")) 

等。

相關問題