LINQ - 11道 LINQ題目

  這兩年,我在設計課程時改變實作的方式,只給問題不給答案讓學員自己思考實作,最後再給答案來討論,就效果而言,其實蠻不錯的,因為有思考,知識就會著床,唯一較難調適的是我不知道在旁邊閒著要幹嘛,常常忍不住就丟答案出來了,以後我看帶PS4去打恐龍好了。這篇文章就因應這種方式而寫的,分成兩部分,第一部分是給問題,這裡我整理了11個LINQ的問題,聚焦在LINQ To Objects,不包括LINQ To Entity Framework或是其它,第二部分則是答案及探討,基本上我希望在你看第二部分前已經用自己的思考得到答案,接著驗證自己的答案,最後再看第二部分,當然,如果你挑出第二部分的答案有問題,我也是非常歡迎的(敬禮)。值得一提的是,在設計這11道題目時,我刻意地避免為了考倒你而出題,所以沒有刁鑽的問題,也沒有陷阱題。(我多用了兩顆CPU想,所以要提一下),第二部分會在連假結束後貼出。

  

 

  這11道題目包含了效能、觀念、應用,每個題目都有一些設計巧思(我認為啦),目的在於凸顯LINQ的一些特性,與其說這是問題,倒不如說這是應該有的技巧,因為除了第11題之外,其它都是你應該可以在5分鐘內得到答案,如果對答案有所疑惑,那麼代表著不會貿然寫出這種程式,也代表永遠不會知道這個做法的優缺點。

1. LINQ Where與foreach

   如下圖,哪個比較快?

2.   在下圖的GenerateFixedPerson產生出500000筆資料,Age會是1-100之間的亂數,在 //calll 處分別呼叫兩個函式,哪個比較快?為什麼?

3.有方法可以加快這個程式的搜尋效能嗎?

4. 假設傳入值是同一個,這兩個函式的結果一樣嗎?效能一樣嗎?為什麼?

5.Min跟Max每次都是重頭跑過,所以若要取得一個元素集的Min跟Max,那麼就得跑兩次,如下

有沒有方法可以只跑一次迴圈?效能會比較好嗎?為什麼?

6.這兩個函式的結果一樣嗎?行為一樣嗎? 為什麼?

7. 用LINQ實作Find Text in Files(在目錄中尋找包含指定字串的檔案,例如.txt、.ini)的功能
8. 這個函式可以正常執行,但有更好的做法嗎?

9. 有沒有方法可以簡化雙層foreach成為一層?

10. 這個例子中,在印出RD部門的薪資總額時,請問Sales的薪資總額計算好了嗎?為什麼?

11. 這是一個大題目,如下例。

switch的缺點是定型,以後如果AlterType增加,就要回到AlterNow增加case區段,有沒有方法可以省掉這個switch,達到增加AlterType不用修改AlterNow?