[爆卦]linq語法教學是什麼?優點缺點精華區懶人包

為什麼這篇linq語法教學鄉民發文收入到精華區:因為在linq語法教學這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者hoyunxian (WildDagger)看板WindowsPhone標題[開發] LINQ最...


說是最基礎,是因為到現在我也還是搞不懂Lamdha運算式還有LINQ的真面目
就只是單純用下去而已,所以背後原理之類的我也很難解釋

這篇教學文純粹是教你怎麼用LINQ去輔助開發而已,
已經知道的請直接略掉吧




就以我的理解來說:

LINQ就是讓一群物件可以用類似查詢資料庫的方法去分門歸類的方法


比方說,圖書館裡面的書尺寸、書名、作者、內容都不一樣
如果我們想要去找圖書館藏書裡面的其中一本書時,你會怎麼做呢?



從第一本翻到最後一本直到找到你要的書?這有點太麻煩了吧?



通常大家應該都會先去找你要的書在哪個類別,然後再照著書架上指示尋找
在明確知道書名與分類的情況下,應該很快就能找到
(這邊先不考慮實際上有可能被上一個閱讀者亂擺或者是圖書館館員錯置的情況)



不過如果你只知道作者的名字,而這作者有很多書呢?
要不然就是你知道書名還有內容,但是分類上卻完全不是你所認定的類別
(比方說陳立誠先生寫的一本關於核能發電的書,乍看之下應該是自然科學或應用科學類,
但實際上卻是被歸類到社會科學類,因此是跟政治相關的書擺一起的,
以台灣的圖書館分類來說,就不是3或4開頭而是5開頭的)

這個時候,大家應該都會直接捨棄舊方法,乾脆找館藏系統來查詢了吧。
只要關鍵字有下對,館藏系統很快就會把書在哪裡還有所有資訊通通丟給你
至於館藏系統到底是怎麼去找到那本書的,
我想除非是對那塊有興趣的,否則應該都不會想去深入思考。


所謂的LINQ,就是擔任這個館藏查詢系統的職責


因為Windows Phone使用的C#都已經是針對過LINQ做過處理,
只要知道用法就可以很快拿來用,也不用去裝什麼外掛SDK了
(副作用就是因為實在太好用,在沒有LINQ的Java、JavaScript上就會覺得很麻煩......)

正如前面所說的,LINQ是館藏查詢系統,
使用館藏查詢系統查出來只會告訴你書擺在哪裡,不會真的把那本書送到你面前
因此LINQ查出來的東西並不是要找的物件,而是一個位置
你要使用一些方法才能把物件給調出來(也就是要自己去書架找)
詳細的方式後面再說。


LINQ的語法有兩種,一種叫做查詢語法,另外一種叫做方法語法
專有名詞實在不懂沒關係,總之前面的查詢語法很像SQL語法,
後面的方法語法則要搭配Lamdha運算式或匿名方法來進行(個人覺得Lamdha比較直覺)
而這些方法已經內建在陣列與清單等列表類別中,
因此不管你用的是List、Array或者是ObservableCollection都可以使用


查詢語法類似於這種方式:

var item = from a in list where a.Name == "WP8.1" select a;

用紅字標出來的就是查詢語法關鍵字,很明顯那些都是SQL的語法
基本上的解讀是
「在list這個群組裡面找出代號為a的變數群,而這些變數的Name屬性要等於"WP8.1"」

雖說實際上的SQL順序是要倒過來寫,但是搭配Visual Studio的情況下
不照著上面那樣寫Visual Studio會不知道你要找什麼東西

方法語法則是類似於這種方式:

var item = list.Where(a => a.Name == "WP8.1");

紅字就是方法,淺藍的箭頭則是Lamdha運算式的核心
結果跟上面查詢語法一模一樣。

Lamdha運算式簡單說就是指派一個變數/方法,然後這個變數/方法要符合後面的運算式
除了這種方法查詢以外,在各種事件的觸發指派上也很常見。


除此之外還有Orderby、Join、Reverse之類的方法與查詢關鍵字


查到之後,要怎麼把這些查詢結果變成真正的物件呢?
答案是透過他另外給的一些方法或者是用Foreach迴圈查詢
如果狀況比較單純的話,可以直接用方法,
但如果是複雜一點的狀況(比方說最終要的結果並不是單純用查詢到的物件)
還是用Foreach迴圈比較簡單明瞭。

Foreach迴圈長的就是下面這個樣子:

foreach(var a in result)
{
(......)
}

要解釋的話,就是根據result這個查詢結果,取出每一個物件(物件的代號是a)
至於接下來要怎麼處理這個a物件就是看個人怎麼寫程式了

查詢方法個人比較常用的是First()和ToList(),
不過ToArray()/Single()/Max()/Min()之類的視狀況而言也不錯
這邊就只單純說明我用的First()和ToList()

First()是傳回查詢結果的第一個,在關鍵字有下好的情況下,
基本上First()一定會是你最想要的那個物件
用Single()雖然也可以傳回一個物件,但如果查詢結果是複數的話就會出錯
所以還是用First()吧,這樣可以減少一些不必要的麻煩。

(當然還有個相對的Last(),但是查詢到最後只剩下一個物件的情況下也沒差了就是)

ToList()是將查詢結果變成一個清單物件(List)
想要直接做物件綁定的話這個方式也不錯。

----------------------------------------------------

以上的文章說來也許跟C_Sharp版比較有關
對Windows Phone/Windows 8的APP而言,或許直接來講講可以用在什麼地方比較好吧

個人是在下面這兩個地方很頻繁的用LINQ:

1. 產生APP用的資料物件時

因為資料源有時蠻混亂的(例如北捷的票價就很雜亂無章......),
因此我會在產生資料物件的時候先用LINQ整理一次

2. APP頁面間的資訊傳遞

WP8的頁面之間只能用文字互傳,Win8/Win8.1/WP8.1可以傳物件,
但是Win8卻有個Bug可能導致閃退(Win8.1記得已經修正),
所以基本上還是先用文字傳遞參數吧

在這情況下,APP頁面可以用傳過來的文字參數當成關鍵字
用LINQ在資料庫物件中快速找出物件出來綁定
(綁定那又是另外一個問題了,下次有時間再寫)
可以節省不少時間與精力
(畢竟每個頁面都要在那邊Foreach有點太麻煩了)


基本上關於LINQ的部分就是講到這邊

最後還是不得不說這LINQ真的有個超大壞處,就是前面說的會讓人變懶了
懶到在沒有LINQ的程式語言就會覺得很綁手綁腳......

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.250.42.19
※ 文章網址: http://www.ptt.cc/bbs/WindowsPhone/M.1396886310.A.851.html
songla1204:先推再看 04/07 23:59
BenShiuan:如果是一些比較複雜的資料庫查詢呢? 04/08 00:25
BenShiuan:喔 我看到了「還有Orderby、Join、Reverse之類的方法」 04/08 00:28
Nuaaukw:以為是LINE的舉手 o.o/ 04/08 00:55
felaray:LINQ給推~~~ 不過我還是不太會XDD 04/08 01:19
YahooTaiwan:我現在已經懶到連foreach都用List.ForEach,一行解決 04/08 01:21
hungys:推LINQ 04/08 02:28
superwave:LINQ真的是神物XD 04/08 10:40
iterator:lambda expression 04/08 12:27
SDCAT:LINQ真的頗有意思... 04/09 01:41

你可能也想看看

搜尋相關網站