從LINQ的Count方法說起-1


幾句閑扯


在我學習LINQ時,確實感覺很爽。
但是時間久了,慢慢也就不那么在意了。但是周圍朋友總是記得我會使用LINQ編程。
記得初中時候學幾何,有一個已知三角形邊長求面積的題,而我正巧知道海倫公式,之后凡是碰到可以使用此公式的題,同學都想起我會做,仿佛那公式應該以我的名字命名一樣……
某人問我有沒有學習LINQ的資料,我實在說不出,因為我從來都沒有系統的去學過LINQ。我基本只是使用幾個IEnumerable的擴展方法,要說學習也只是從某些第X版書中讀過幾句,平時也就在一個集合點一下然后看看各自說明。
當然,LINQ不止於此,我也說不出到底LINQ都包含什么,什么是LINQ。

給一個東西,一門技術下定義,從來都不是一件簡單的事。

事出有因


事情是這樣的,今天有人問我一個小問題,關於LINQ,然后我不經意間看到一行代碼:

 

int count = lst.Where(ch => char.IsNumber(ch)).Count();

 

代碼讀起來很簡單,就是從一個char集合里找出為數字的個數。
代碼沒問題,但是還有個更好的寫法:

 

int count = lst.Count(char.IsNumber);

 

即便他不知道Count方法可以傳參,那么他為什么不寫成:

int count = lst.Where(char.IsNumber).Count();

  

我相信他根本就不知道這里為什么要寫ch => char.IsNumber(ch),根本就不知道這里需要的是一個方法。
這讓我想起一個男同事說一個女同事(所謂同事,都是程序猿),女的剛畢業,不怎么會,然后男的說女的寫代碼ToString不帶括號。
這姑且說是這個女同事不知道調用方法即使沒有參數也需要帶括號,或者說她根本就不知道ToString是一個方法,但是同樣也說明這個男同事以為方法只能去調用(call)。
或許簡單下面的代碼他會覺得很驚訝:

 

string[] arr = lst.Where(char.IsNumber).Select(char.ToString);

 

又或者在事件上:

 

delegate string GetNumberDelegate(char ch);
event GetNumberDelegate GetNumberEvent;
...
this.GetNumberEvent += char.ToString;

 

幾點思考


我想大多數人習慣於使用ch => char.IsNumber(ch)是因為這樣感覺很好理解,程序可以讀出來。是的,寫LINQ最爽的一點就是這里了。
比如說使用Where方法,知道集合是一個char集合,那么ch很自然的可以當做char集合中每個元素,=>之后寫下對每個元素的判斷,很好理解,用起來很舒服。
但是切莫執迷於表像而偏離本質。
說起函數當做參數傳遞,記起曾經在封裝一個日歷控件的時候遇到一個問題:需要在已提交報表、未提交報表和還沒到的日子分顏色:

但是關於顏色問題,修改了好多次,最后干脆我給封裝的控件增加一個Func<string, Color>,根據給定的類型(提交或未提交)去給定顏色。

 


最后我要說的是我本來初衷不是寫好多人不知道函數也是一個對象,不知道函數也可以去傳遞,但是寫一下給寫跑題了,干脆就繼續寫下去。而原本我是想說說幾個LINQ擴展方法的先后問題,留在下一篇博客中說吧。

 

我的博客原文地址:從LINQ的Count方法說起

歡迎來我的博客:nanqi.info


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM