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()

    回覆刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。