今天在網路上看到有人提出一個問題:
字串一:ABCDEF
字串二:ABC1D2E3F
要用怎麼取出兩個字串差異的 123 呢?
並不是取出數字的部份,這邊只是做個簡單示意,主要是取出兩個字串有差異的部份,一開始覺得這沒有什麼,但是細想一下…這其實也蠻好玩的,就當做練習題來做做看。
方法一:用LINQ來取出差異
先把兩個字串給連結為一個字串,並且使用 string.ToCharArray() 方法將字串給轉換為字元陣列,將這個字元陣列使用 Group() 方法來做分組。
取得一個分組集合,這個分組集合的內容除了字元本身外,另一個就是字元出現的次數,而出現次數為一次的就是我們所要的差異部分。
原本想說這一題應該就可以結案了,但是細想一下,不過就是兩個單純的字串然後取出差異的部份而已,我上面的寫法也未免太過累贅了,還兩個字串做連結然後轉為字元陣列再去做 Group 然後取出出現次數為一的…
這一切的一切都太沒必要了,所以就有了下面的方法。
方法二:「取出差異的部份」那就是取出差集,用Except就對了!
就是上面那樣簡單,就是用「Except」… 結案!
補充:如果說很堅持 Except 一定得要是物件集合的話,那就把字串用 string.ToCharArray() 方法轉為字元陣列
結果……反正就是一樣~
延伸閱讀:
愛流浪的小風 - [C#] 對List<T>取交集、聯集及差集
以上!
作者已經移除這則留言。
回覆刪除還有一個方法
回覆刪除因為我們知道數字是介於 48-57的 ASCII 中
所以利用 Lambda Expression 一行就好了
"ABC1D2E3F".ToCharArray().AsEnumerable().Where(c => (int)c>=48 && (int)c<=57).Dump();
哪個... 這個例子並不是要找出數字的部份,只是要找出兩個字串的差異而已
刪除第一張圖的下面string.ToCarArray(),應為string.ToCharArray()
回覆刪除已經修正,謝謝告知。
刪除