Linq入门

为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表……每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ 诞生的理由——以一种统一的方式操作各种数据源,减少数据访问的复杂性。LINQ 目前可以对XML, Object, SQL 做数据访问,今后还会有LINQ to Entity的功能。说来惭愧,我也是刚刚才接触LINQ,先从最简单的开始吧,先来看以下代码。

1 MethodInfo[] methods = typeof(StringBuilder).GetMethods();
2 var result = from m in methods where m.IsStatic == false select m.Name;
3 var res = (from m in methods where m.IsStatic != true select m.Name).Distinct();
4 var result2 = from m in methods where m.IsStatic != true
5 group m by m.Name into g select new { MethodName = g.Key, Overload = g.Count() }; //匿名类
6   MyClass mc = new MyClass { Methods = "myMethod", Overload = 1 };
7 foreach (var r in result2)
8 {
9 Console.WriteLine(r);
10 }
11 Console.ReadKey();

看起来,有点像javascript 里面的弱类型的变量声明。但是,C#是强类型的,尽管你用var 来声明,编译器还是可以根据上下文推倒出它当前的类型。比如这个例子里面,result 就是IEnumerable 类型的。在这里面,写IEnumerable 和写var 是一样效果的,显然,var 会简单得多。你不用考虑数据操作的返回值是什么类型,还能享受强类型声明带来的方便实惠。还有from m in methods 这句,m 是什么东西,m 是隐式声明的一个变量,尽管没有声明,但编译器根据上下文,推断出它的类型是MethodInfo 型的!.NETFramework 3.5 的编译器的确是聪明了很多。纯粹给懒人用的var 关键字,告诉编译器(对于CLR 来说,它是不会知道你是否使用了var,苦力是编译器出的),你自己推断它的类型吧,我不管了。但是既然让编译器推断类型就必须声明的时候赋值,而且不能是null 值。注意,这只能用于局部变量,用于字段是不可以的。

Lambda 表达式:
var list = new [] { "aa", "bb", "ac" };
var result = Array.FindAll(list, s => (s.IndexOf("a") > -1));
foreach (var v in result)
  Console.WriteLine(v);
其实和2.0 中的匿名方法差不多,都是用于产生内联方法,只不过Lambda
表达式的语法更为简洁。语法如下:
(参数列表) => 表达式或者语句块
其中:
参数个数:可以有多个参数,一个参数,或者无参数。

参数个数:可以有多个参数,一个参数,或者无参数。
表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。
前面的示例分别是1 个参数的例子,下面结合扩展方法来一个复杂的例子:
public delegate int mydg(int a, int b);
public static class LambdaTest
{
  public static int oper(this int a, int b, mydg dg)
  {
    return dg(a, b);
  }
}
Console.WriteLine(1.oper(2, (a, b) => a + b));
Console.WriteLine(2.oper(1, (a, b) => a - b));

再来看如下查询例子:

            var persons = new List<Person> { new Person { username = "a", age = 19 },
                        new Person { username = "b", age = 20 },
                        new Person { username = "a", age = 21 } };
            var selectperson = from p in persons where p.age >= 20 select p.username.ToUpper();
            foreach (var p in selectperson)
                Console.WriteLine(p);

    public class Person
    {
        public string username { get; set; }
        public int age { get; set; }
    }
查询句法是使用标准的LINQ 查询运算符来表达查询时一个方便的声明式简化写法。该句法能在代码里表达查询时增进可读性和简洁性,读起来容易,也容易让人写对。Visual Studio 对查询句法提供了完整的智能感应和编译时检查支持。

初步入门到此。。。

原文地址:https://www.cnblogs.com/lys_013/p/1854346.html