【LINQ技术】扩展特性和LINQ操作符

LINQ特有的编程结构

LINQ就像是嵌入到C#中的强类型查询语言,尽管和SQL查询很像,但语法却并不相同,甚至还有截然相反的一面。

LINQ是在.NET发展到3.5版的时候被引进的,C#和VB语言都为此做了许多工作,扩展了大量新的编程结构。

一、隐式类型本地变量

var——一个如此小巧的关键字却有着强大的力量。

var varInt=1;var varBool=True;var varString=”String, String, String”;Console.WriteLine(“varInt is a: {0}”,varInt.GetType().Name);Console.WriteLine(“varBool is a: {0}”,varBool.GetType().Name);Console.WriteLine(“varString is a: {0}”,varString.GetType().Name);

上面的代码会很神奇的自动显示出它们各自的类型。

var的限制:

1.var不能用于字段数据 2.var不能用于返回值或参数类型 3.必须在声明时分配值,且值不为NULL

但var可以这样:

var alarmClock=new AlarmClock();alarmClock=null;var varInt=1;var varInt2=varInt;bool varBool=True;var varBool2=varBool;static int Alarm(){var alarm=”09:20″;return alarm;}

隐式类型数据是强类型数据。类型推断延续了C#语言的强类型特性,并且只会在编译时影响变量的声明。之后,该数据点被视为它声明的类型。为该变量分配不同的类型将导致编译时错误。

;s=”Funny…”;// 因此可以调用string的所有成员string bigS=s.ToUpper();// 但不能将非string类型的数据分配给ss=True;

var为LINQ而生

LINQ技术使用的是查询表达式,它可以根据表达式本身的格式产生动态创建的结果集。但有时在某些情况下根本无法显示定义查询的访问类型,这时隐式类型就会发挥作用了。

二、对象和集合初始化语法

在扩展这个新的特性之前,我们要创建一个对象并给其属性初始化会是这样:

var rect = new Rect();rect.Height=100;rect.Width=200;

但是支持C# 3.0加入了这个新特性,代码就成了这样:

var rect = new Rect(){Height=100,Width=200};

如果有构造函数的话还可以在括号内传入参数呢,就像这样:

var rect = new Rect(“bigRect”){Height=100,Width=200};

如果对于集合,那就优势就更加明显了。

List<Alarm> alarmList = new List<Alarm>{new Alarm { Name = “todayAlarm”, Description=new Desc{ Time=”07:20″,Location=”Home”}},new Alarm { Name = “tomorrowAlarm”, Description=new Desc{Time=”08:40″,Location=”Company”}},new Alarm { Name = “nextYearAlarm”, Description=new Desc{Time=”18:40″,Location=”Shanghai”}},};

将对象/集合初始化语法和隐式类型本地变量相结合就可以声明匿名类型。

三、匿名类型

通过这个特性可以快速建立数据的“结构”,编译器将根据名称/值对的集合在编译时生成的类。该类型是基于值的语义构建的,因此System.Object中的每个虚方法都要重写。要定义一个匿名类型,可以声明一个隐式类型变量,并使用对象初始化语法指定数据的结构。

var alarm=new {currentTime=DateTime.Now,alarm=new {Name=”todayAlarm”,Location=”Shanghai”,Time=”18:20″},};

四、扩展方法

通过面向对象的继承机制,我们可以给一个类添加新的方法等,但这不是唯一的方法。

C#的扩展方法不用子类就能向已知类型中添加新的功能,当然了,它还可以向不能有子类的密封类和结构中添加新的功能。但是需要注意的是:

1.在写扩展方法时,第一个参数必须使用this限定符,用来表示被扩展的类型 2.第一个参数不能有ref或者out的修饰符 3.第一参数还不能是指针类型 2.扩展方法只能存在于静态类中,并且必须使用static关键字将方法声明为静态的

而且使用扩展方法并不会影响性能,因为这些都是编译器需要做的,而通过继承则需要影响性能。

五、Lambda表达式

Lambda表达式可算是Lisp语言的核心了,如果想要了解该语言可以访问我的其他博客。C#添加了这个特性可谓是有了质的提升。

Lambda大大简化了.NET委托的使用,减少了需要手工输入的代码。

List<int> list=new List<int>();list.AddRange(new int[]{10,21,4,8,3,59});List<int> list2=list.FindAll(i=>(i%2)==1);Console.WriteLine(“Here are your odd numbers:”);foreach(int n in list2){Console.Write(“{0}\t”,n);}

C# LINQ查询操作符是调用System.Linq.Enumerable类中方法的简便方式,这些方法通常都使用委托作为参数,用来处理数据生成正确的结果集。

LINQ的用途

1.数据

“人无完人金无足赤”,只要是人就不会是完美的,

【LINQ技术】扩展特性和LINQ操作符

相关文章:

你感兴趣的文章:

标签云: