唯倚社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 430|回复: 5

Visual Basic 9 不完全入门之LINQ进阶

[复制链接]

59

主题

169

帖子

754

积分

版主

Rank: 7Rank: 7Rank: 7

积分
754
发表于 2017-9-14 15:32:24 | 显示全部楼层 |阅读模式

轻松玩转社区

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
核心提示:这一篇随笔,则将以更复杂的示例,展示 Linq 的灵活性与扩展性,以至于探索 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 团队,我们将尽力提供更好的技术随笔。



21

主题

148

帖子

1170

积分

超级版主

Rank: 8Rank: 8

积分
1170

最佳新人

发表于 2017-9-23 14:49:48 | 显示全部楼层
请楼主吃麻辣烫可好
回复

使用道具 举报

59

主题

169

帖子

754

积分

版主

Rank: 7Rank: 7Rank: 7

积分
754
 楼主| 发表于 2017-9-23 18:02:02 | 显示全部楼层
我自横田向天笑,笑完我就去睡觉
回复

使用道具 举报

31

主题

151

帖子

812

积分

版主

Rank: 7Rank: 7Rank: 7

积分
812
发表于 2017-9-23 19:43:13 | 显示全部楼层
我为自己袋盐
回复

使用道具 举报

0

主题

108

帖子

249

积分

版主

Rank: 7Rank: 7Rank: 7

积分
249
发表于 2017-9-23 19:52:00 | 显示全部楼层
你懂的
回复

使用道具 举报

137

主题

308

帖子

3832

积分

LV3

Rank: 3Rank: 3

积分
3832

最佳新人

发表于 2017-9-23 20:10:40 | 显示全部楼层
如果这就是爱,再转身的时候就该留下
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|weiecn ( 湘ICP备14002058号 )

GMT+8, 2018-12-17 18:11 , Processed in 0.058951 second(s), 8 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表