2013-08-05 89 views
3

我有一個像這樣的函數(foo):我需要比較輸入字符串並相應地執行任務。 任務相同,但僅限於選定的一組值。對於所有其他值什麼都不做。針對一組字符串值的字符串比較

function foo(string x) 

{ 
if(x == "abc") 
    //do Task1 

if(x == "efg") 
    //do Task1 
if(x == "hij") 
    //do Task1 
if(x == "lmn") 
    //do Task1 
} 

是否有任何其他方式做檢查除此以外?或者OR運營商在if

什麼是首選方式?

+4

的['之開關(http://msdn.microsoft.com/en-us/library/vstudio/06tc147t.aspx)語句是非常適合這樣的情況下;它允許你寫出很好地分開的目標值和最少的不必要的樣板。 – Jon

+0

一個switch語句在這裏沒有太大的區別IMO。 – James

+0

將您的比較輸入到列表或集合中,並遍歷該集合並在for循環中檢查並跟蹤哪個集合條目匹配。我也不會這樣做==對字符串比較我會使用.Equals擴展方法 – Bearcat9425

回答

10

有做它的許多方面。其中之一是如下:

var target = new HashSet<string>{ "abc", "efg", "lmn" }; 
if (target.Contains(x)) { 
    ... 
} 

在MAX [我的字符串列表]可以長到50個字符串這是一種罕見的可能性。

,那麼你要target一個static readonly在你的類,像這樣:

private static readonly StringTargets = new HashSet<string>{ "abc", "efg", "lmn" }; 

這樣做將確保集僅創建一次,而不是重新創建每個執行去時間通過使用它的方法。

+0

+1我會說這是比'switch'更好的替代方法,''switch''你仍然在編寫相同數量的代碼。 – James

+0

同意,也取決於你放在那裏的比較條目的數量,使用List VS和哈希集合可能會更快,但隨着比較列表的增長,我認爲hashset提供了更好的性能。在這裏看到這個職位。 http://stackoverflow.com/questions/150750/hashset-vs-list-performance – Bearcat9425

+0

我認爲最好的事情是,它可以讓你輕鬆地將'target'移動到某個類或提供程序中,並執行if(BusinessRulesFooClass.Something (X))'。事實上,根據情況,它可能應該一直如此...... – anaximander

7

做這樣的

function foo(string x) 
{ 
    switch(x) 
    { 
     case "abc": 
     case "efg": 
     case "hij": 
     case "lmn": 
     { 
      //do task 1 
      break; 
     } 
     default: 
     break; 
    } 
} 

或者,你可以做到這一點

if(x == "abc"||x == "efg"||x == "hij"||x == "lmn") 
    //do Task1 
+1

+1爲邏輯或...明顯的替代 –

+0

以這種方式開關案例的實施可能是一個更好的解決方案,我認爲。 – TutuGeorge

+0

這是否會導致對所有情況的比較操作?而不是完成尋找第一次事件的任務。 – TutuGeorge

0

的一種方法是使接受字符串數組,然後看看是否數組包含X

function foo(string x) 

{ 


    string[] strings = new string[] {"abc", "efg", "hij", "lmn"}; 

    if (strings.contains(x)){ 
     //do task 1 
    } 
} 
-1

您可以使用switch語句用默認值捕捉到任何不匹配

http://blogs.msdn.com/b/brada/archive/2003/08/14/50227.aspx

function foo(string x) { 

    switch(x) { 

    case "abc": 
     //do task 1 
    break; 

    case "efg": 
     //do task 2 
    break; 

    default: 
     //all other cases 
    break; 
    } 
} 
+0

他想執行相同的任務而不是不同的任務(任務1在任何一個任務上,任務1在任務1上而任務2在另一個上) –

+0

答案是正確的,但格式錯誤...可能誤解了問題... –