【Linq】-相关技术

本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集成查询)。通过LINQ,我们可以使用相同API操作不同的数据源。接下来就让我们看看LINQ是什么以及如何使用?

再此之前,需要先了解的相关技术

1、隐式类型、匿名类型、对象初始化器

1) 隐式类型,使用var关键字创建,C#编译器会根据用于初始化局部变量的初始值推断出变量的数据类型。(不过我个人认为,能用具体类型的地方尽量不要用var关键字,因为这样会让你遗忘“被封装类库”方法的返回值类型–有损可读性)
隐式类型使用限制:
a) 隐式类型只能应用于方法或者属性内局部变量的声明,不能使用var来定义返回值、参数的类型或类型的数据成员。
b) 使用var进行声明的局部变量必须赋初始值,并且不能以null作为初始值。
2) 匿名类型,只是一个继承了Object的、没有名称的类。C#编译器会在编译时自动生成名称唯一的类。
3) 对象初始化器,提供一种非常简洁的方式来创建对象和为对象的属性赋值。(相关还有“集合初始化器”)

由于C#强类型语言,即我们在声明变量时必须指定变量的具体类型。所以在创建匿名对象时,需要结合隐式类型、匿名类型、对象初始化器一起创建匿名对象。(避免类型转换)
示例:
var person = new { name = “heyuquan” , age = 24 }

2、Lambda表达式,Func委托

1) Lambda表达式只是用更简单的方式来书写匿名方法,从而彻底简化.NET委托类型的使用。
Lambda表达式在C#中的写法是“arg-list => expr-body”,“=>”符号左边为表达式的参数列表,右边则是表达式体(body)。参数列表可以包含0到多个参数,参数之间使用逗号分割。
2) Func委托
Func委托,是微软为我们预定义的常用委托,封装一个具有:零个或多个指定类型的输入参数并返回一个指定类型的结果值的方法。
这里写图片描述
示例:

static void Main(string[] args)
    {
        // 委托函数
        Func<string, string, string> func1 = Hello;
        // 匿名方法
        Func<string, string, string> func2 =
            delegate(string a, string b) 
            { 
                return "欢迎光临我的博客" + Environment.NewLine + a + " " + b; 
            };
        // Lambda表达式
        Func<string, string, string> func3 =
            (a, b) => { return "欢迎光临我的博客" + Environment.NewLine + a + " " + b; };
        // 调用Func委托
        string helloStr = func2("滴答的雨", @"http://www.cnblogs.com/heyuquan/");
        Console.WriteLine(helloStr);
}
    static string Hello(string a, string b)
    {
        return "欢迎光临我的博客" + Environment.NewLine + a + " " + b; 
    }

3、扩展方法

1) 扩展方法声明在静态类中,定义为一个静态方法,其第一个参数需要使用this关键字标识,指示它所扩展的类型。
2) 扩展方法可以将方法写入最初没有提供该方法的类中。还可以把方法添加到实现某个接口的任何类中,这样多个类就可以使用相同的实现代码。(LINQ中,System.Linq.Queryable.cs和System.Linq.Enumerable.cs 正是对接口添加扩展方法)
3) 扩展方法虽定义为一个静态方法,但其调用时不必提供定义静态方法的类名,只需引入对应的命名空间,访问方式同实例方法。
4) 扩展方法不能访问它所扩展的类型的私有成员。

示例:

public static IEnumerable<TSource> MyWhere<TSource>(
    this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
    foreach (TSource item in source)
    {
        if (predicate(item))
            yield return item;
    }
}

转自:http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

猜你喜欢

转载自blog.csdn.net/ldb987/article/details/80228134