網頁

2011年9月14日 星期三

練習題:取出兩個字串中有差異的字


今天在網路上看到有人提出一個問題:

字串一:ABCDEF

字串二:ABC1D2E3F

要用怎麼取出兩個字串差異的 123 呢?

並不是取出數字的部份,這邊只是做個簡單示意,主要是取出兩個字串有差異的部份,一開始覺得這沒有什麼,但是細想一下…這其實也蠻好玩的,就當做練習題來做做看。



方法一:用LINQ來取出差異

image

先把兩個字串給連結為一個字串,並且使用 string.ToCharArray() 方法將字串給轉換為字元陣列,將這個字元陣列使用 Group() 方法來做分組。

取得一個分組集合,這個分組集合的內容除了字元本身外,另一個就是字元出現的次數,而出現次數為一次的就是我們所要的差異部分。

 

原本想說這一題應該就可以結案了,但是細想一下,不過就是兩個單純的字串然後取出差異的部份而已,我上面的寫法也未免太過累贅了,還兩個字串做連結然後轉為字元陣列再去做 Group 然後取出出現次數為一的…

這一切的一切都太沒必要了,所以就有了下面的方法。

 

方法二:「取出差異的部份」那就是取出差集,用Except就對了!

image

就是上面那樣簡單,就是用「Except」… 結案!

 

補充:如果說很堅持 Except 一定得要是物件集合的話,那就把字串用 string.ToCharArray() 方法轉為字元陣列

image

結果……反正就是一樣~

 

延伸閱讀:

愛流浪的小風 - [C#] 對List<T>取交集、聯集及差集

 

以上!

5 則留言:

  1. 還有一個方法
    因為我們知道數字是介於 48-57的 ASCII 中
    所以利用 Lambda Expression 一行就好了

    "ABC1D2E3F".ToCharArray().AsEnumerable().Where(c => (int)c>=48 && (int)c<=57).Dump();

    回覆刪除
    回覆
    1. 哪個... 這個例子並不是要找出數字的部份,只是要找出兩個字串的差異而已

      刪除
  2. 第一張圖的下面string.ToCarArray(),應為string.ToCharArray()

    回覆刪除