2012-07-23 28 views
0

我正在試圖在兩個字符串數組上執行SQL MINUS的等價操作。下面是我試圖複製代碼:我想改寫這個作爲對MINUS兩個字符串數組的Lambda表達式

 string returnValue = ""; 
     foreach (string eachWord in allWords) 
     { 
      foreach (string ignoreWord in ignoreWords) 
      { 
       if (eachWord != ignoreWord) 
       { 
        returnValue += eachWord; 
       } 
      } 
     } 

returnValue = allWords.Minus(ignoreWords); 

或者同樣簡潔。我意識到在幕後我會得到相同的代碼,但我只是迂腐!

+1

在第e場景你將**不**得到相同的代碼。你的代碼是O(M * N),其中M是'allWords'的大小,N是'ignoreWords'的大小。使用更合適的算法(比如Linq的Except中使用的算法,你可以得到O(N + M),關鍵是將一個集合存儲在一個HashSet中,該集合有O(1)搜索,沒有嵌套循環,你有一個循環(添加項目設置),然後是另一個單一的循環(做搜索)。 – Servy 2012-07-23 19:41:39

回答

8
returnValue = allWords.Except(ignoreWords); 
0

如果你想擁有隻有字符串不是IEnumerable<string>,你可以做這樣的:

var res = allWords.Except(ignoreWords); 

然後,

StringBuilder sb = new StringBuilder(); 
     res.ForEach(item => sb.Append(item)); 
     string ss = sb.ToString(); 

,或者如果你想要一些隔膜你可以這樣做:

string concatenatedStr = string.Join(",", res.ToArray()); 
相關問題