程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> Visual Basic 9不完全入門之LINQ進階

Visual Basic 9不完全入門之LINQ進階

編輯:VB.NET

在上一篇隨筆中,我透過簡單的代碼,向大家展現了 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 團隊,我們將盡力提供更好的技術隨筆。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved