Visual Basic 9不完全入門之LINQ進階。本站提示廣大學習愛好者:(Visual Basic 9不完全入門之LINQ進階)文章只能為提供參考,不一定能成為您想要的結果。以下是Visual Basic 9不完全入門之LINQ進階正文
在上一篇隨筆中,我透過復雜的代碼,向大家展示了 Visual Basic 9 中 Linq 沖動人心的新特性。而這一篇隨筆,則將以更復雜的示例,展現 Linq 的靈敏性與擴展性,以致於探究 Linq 的任務原理與進階使用。
Linq 的缺乏
.Net Framework 3.5 Beta 1 中,LINQ 的使用還存在一定限制,例如不支持 Group By,Having,以及 Join 語法。並且,它或多或少還存在一些 Bug,因而不建議用於需求高波動性的環境中。當然,置信在最終發布版本中,它的才能將大大進步,畢竟這是 .Net Framework 3.5 中最重要的一項新增功用。
關於匿名類型
實踐上,Visual Basic 9 & C# 3.0 中,都曾經完成了對匿名類型的支持。例如:
Visual Basic 9 匿名類型示例
Dim Person = New With {.Name = "John Chen", .Age = 13}
Console.WriteLine("Name:" & Person.Name)
Console.WriteLine("Age:" & Person.Age)
這是為 Linq 而預備的一項極為無益的語法特性,雖然它也是編譯時行為。當它使用在 Linq 中時,可以運用 Select 語句,隱式創立一組匿名類型對象。
留意:Linq 中,Select 語句後置,這是為了 IDE 中智能感知的需求。
匿名類型做了什麼?
Person 的匿名類型生成代碼
Public Class _ClosureClass _Closure$__10
' Methods
<DebuggerNonUserCode> _
Public Sub New()Sub New()
<DebuggerNonUserCode> _
Public Sub New()Sub New(ByVal other As _Closure$__10)
' Fields
Public $VB$Local_Name As String
Public $VB$Local_Age As Integer
End Class
實踐上,它在編譯時生成了一個 Closure 類型,封裝這個看似靜態的匿名類型。不過,Dynamic Interface(靜態接口)曾經被取消了。
Linq 又做了什麼?
首先必需理解,Linq 實踐上是一種編譯時行為。編譯器將 Linq 表達式轉換為流暢難懂的嵌套調用,以堅持與 .Net 2.0 兼容。IQueryable 就應運而生,提供了大批查詢函數,便於停止嵌套調用;擴展辦法也得以大展身手,使 .Net 2.0 原有的集合類型支持 Linq 的語法特性。因而,不要擔憂 Linq 帶來的兼容性問題。
Linq 中的排序
當然,您可以運用 IEnumerable(Of T) 中的 Orderby 函數,但是我十分不建議那麼做。您可以運用完全像 T-SQL 一樣的語法:
Dim Data As String() = {"a", "b", "d", "c"}
Dim Query = From O In Data Order By O Descending '這就是中心
'輸入信息
For Each QItem In Query
Console.WriteLine(QItem)
Next
Linq 中的跨數組查詢
目前的 Visual Basic 9 Beta 1 中還不支持在查詢語句中運用 Join, Union 等初級類 SQL 功用,因而只能用極端復雜的方法,就是直接調用 IEnumerable(Of T) 中的 Union,Order By 函數。但是,您還是可以經過一些變通手法,到達需求的功用。例如:
Linq 中的跨數組查詢示例
Dim CLRLanguage() As String = {"Visual Basic", "C#", "J#", "C++/CLI"}
Dim CLRCount() As KeyValuePair(Of String, Integer) = {New KeyValuePair(Of String, Integer)("Visual Basic", 1000000), _
New KeyValuePair(Of String, Integer)("C#", 1200000), _
New KeyValuePair(Of String, Integer)("J#", 300000), _
New KeyValuePair(Of String, Integer)("C++/CLI", 600000)}
Dim Query = (From O As String In CLRLanguage Order By (From Count In CLRCount Where Count.Key = O Select Count.Value))
溫故知新
Visual Basic 9 不完全入門系列(1) : 語法糖
Visual Basic 9 不完全入門系列(2) : 語法加強
Visual Basic 9 不完全入門系列(3) : LINQ 簡介
結語
Linq 本質上依然是編譯時行為,這決議了它不能夠作出過多的變化,但是它所代表的疾速開發的勢頭,則是難以改變的。畢竟,沒有人希望再以流暢難懂的語法寫出流暢難懂的順序,哪怕它在功能上有一定的提升。近來改版忙碌,加之課業繁重,寫作速度不得不加快,因而見諒。同時,希望您能關注 Visual Basic 團隊,我們將盡力提供更好的技術隨筆。