linq特性

来源:互联网 发布:软件系统实施方案模板 编辑:程序博客网 时间:2024/06/05 18:25

1.        目标

相关预备知识

Linq ToObject

Linq ToData

Linq To Xml

 

2.        linq的体系结构

20070818175601_01

3.        自动属性

原有的C#语法采用如下方式定义属性

public class Person

{

    private string name;

    private int age;

    public string Name

    {

       get { return name; }
    set { name = value;}

    }

    public int Age 

    {

       get { return age; }
    set { age = value; }

    }

}

采用自动属性不需要定义内部字段

public class Person

{

    public string Name

    {

       get;
       set;

    }

    public int Age 

    {

       get;

       set;

    }

}

4.        自动初始化器

原来创建一个对象并给属性赋值的语法如下:

Person person = new Person();
person.Name = 
”吴家仁”;

person.Age = 32;

使用自动化初始器后语法如下:

Person person = new Person (){Name = ”吴家仁”, Age = 32};

也可以嵌套使用

Person person = new Person (){Name = "Scott“,  Age = 32,
      Address = new Address {Street = "One Microsoft Way",
         City = "Redmond“, State = "WA“, Zip = 98052 }
   };

5.        集合自动初始化器

集合初始化器语法如下:

List<Person> people = new List<Person> 

{
    new Person { Name = "Scott",Age = 32 },
    new Person { Name = "Bill", Age = 50 },
    new Person { Name = "Susanne", Age = 32 }
};

6.        扩展方法

如果现有的一个类,想给它加上新的函数,原有的方式是从现有的一个类继承一个新的类,在新的类中加入需要的函数,现在提供了新的方式给现有的类添加函数而且不用继承,这就是扩展方法。现以扩展String类为例,给String类加一个判断是否为电子邮件格式的函数。

首先新增一个类,如下

public static class ScottGuExtensions

{

    public static bool IsValidEmailAddress(this string s)

    {

        Regex regex = new Regex(@"^[/w-/.]+@([/w-]+/.)+[/w-]{2,4}$");

        return regex.IsMatch(s);

    }

}

类和方法都必须是静态的,方法参数前有“this”,表示附加到实例上去

扩展方法

7.        隐式类型变量

隐式类型使用var关键字来声明变量,在变量声明时不需要指定数据类型,如下:

var v=”test string”;

隐式类型虽然不须声明变量类型,但要求在声明时赋值并可通过所赋的值推断出var变量的类型,所以隐式类型依然是强类型。

8.        隐式类型变量使用限制

Ø        必须在声明时赋值并能正确推断,以下都是错误的。

var a=null;

var b;

Ø        只能应用在方法或属性内部的局部变量

public class Person

{

     var name="test";

     public var GetName()

     {

          return “”;

     }

}

9.        隐式类型数组

与局部变量相同地,可以定义隐式类型数组。如下:

  // 实际上是int[]

 vararrayA = new[] { 1, 2, 3, 4 };

 // 实际上是double[]

 vararrayB = new[] { 1, 0.5, 3.14, 2.71828 };

 // 实际上是string[]

 vararrayC = new[] { "Nocturne", null, "Studio,"SpadeQ" };

 // 错误,不允许混合类型

 vararrayD = new[] { 1, "one", 2, "two" };

10.    匿名类型

匿名类型允许开发人员在代码内简明地定义行内类型,而不用显式地对类型定义一个正式的类声明。 使用匿名对象自动化初始器来获取一个匿名类型对象,如下:

      var person=new {Name=”张学友”,Age=30};

    如果一个匿名类型被初始化而另一个匿名类型位于范围域中,并且它们的签名相同,第二个类型将自己占用第一个类型的类型。例如

var person=new {Name=”张学友”,Age=30};

var person2=new {Name=”刘德华”,Age=30};

person=person2;

11.    匿名方法

一般使用如下方式定义方法

public void FunName(string msg)

{

     MessageBox.Show(msg);

}

现在多了一种方式

Action<string> func = delegate(string msg)

{

MessageBox.Show(msg);

};

调用FunNamefunc效果一样

如果方法有返回值,使用Func代替Action

List集合有一个扩展方法“Where”,该方法要求一个返回布尔值的委托,Where方法遍历List的集合,取出集合中的元素并以此为参数调用委托指向的函数,如果函数返回”true”则将该元素放入返回的结果集(实现IEnumerable泛型接口的集合)中。

List<string> list = new List<string> { "asp", "C#", "C++", "javascript" };

IEnumerable<string> result= list.Where( delegate(string s) {

                    return s.IndexOf("a") >= 0; } );

           

foreach (string s in result)

{

    MessageBox.Show(s);

}

12.    Lambda表达式

Lambda表达式以一种更简洁的方式定义匿名方法,上一个示例中的匿名方法改为Lambda表达式后如下:

List<string> list = new List<string> { "asp", "C#", "C++", "javascript" };

IEnumerable<string> result= list.Where(s=>s.IndexOf(“a”)>=0 );

对比两个示例,由以下定义匿名方法语句

delegate(string s) {  return s.IndexOf("a") >= 0; }

改为了

S=>s.IndexOf(“a”)>=0;

=>符号前的是参数,后面是函数体,并且不需要return。如果有多个参数,使用(),如以下语句为一个Button添加响应函数

this.btnLambda2.Click += (src,arg)=>MessageBox.Show("别动我!");

13.    Linq To Object

使用Lamdba表达式可以对数组及集合进行类似SQL语句的查询,以下是一个Lamdba查询,查询长度等于3并且不是“asp”的字符串。

string[] array = new string[] { "asp","cb","vba","java","vba"};

var result=array.Where(s=>s.Length==3 && s!=“asp”);

我们可以改为另一种Linq的语法,和上面的语句等效

//Linq语法,form放在前面是为了智能感知

var result = from s in array where  s.Length==3 && s!="asp"  select s;

以上是一个基本的Linq语句,如果想使用Distinct可以如下:

var result =(from s in array where s.Length==3

                 && s!="asp"  select s).Distinct();

Lambda示例中我们讲了,ListWhere方法返加一个实现了IEnumerable接口的集合,该接口有一个扩展方法Distinct,以上的Linq语句返回的也是一个IEnumerable接口,一个Linq语句的返回值类型由编译器进行类型推断。

14.    XLinq

xml

XLinq通过初始化器语构建一个XML对象,如下:

XElement people =

   new XElement("people",

     new XElement("person",

       new XElement("firstname", "Bob"),

       new XElement("lastname", "Willam"),

       new XElement("age", "50"),

       new XElement("phone", "012345",

         new XAttribute("type", "mobile")),

       new XElement("phone", "987654",

         new XAttribute("type", "home")),

       new XElement("address",

         new XElement("country", "USA"),

         new XElement("city", "LA"))));

people.Save(@"people.xml");

同样可以通过Linq语法查询XML如下:

XDocument people = XDocument.Load("people2.xml");

var nodes = from ele in people.Root.Elements()

    where Ele.Elements(("firstname").First().Value

    == "jinmax select ele;

nodes.First().Elements("lastname").First().Value = "测试";

people.Save("people2.xml");

 

原创粉丝点击