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

_

Public Sub New()Sub New()

_

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 团队,我们将竭力提供更好的技术随笔 。