幾句閑扯
在我學習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