• Linq学习(一)


    与LINQ有关的语言特性

    1、隐式类型 var

    2、匿名类型 如:var obj = new {Guid.Empty, myTitle = "匿名类型", myOtherParam = new int[] { 1, 2, 3, 4 } };

    3、自动属性 public string Title { get; set; }

    4、初始化器  var myObj1 = new MyObj() { id = Guid.NewGuid(), Title = "allen" };

    5、委托 

    6、泛型 List<T>、Dictionary<TKey, TValue>等泛型类型都是.net类库定义好并提供给我们使用的

    public static class SomethingFactory<T>
              {
                  public static T InitInstance(T inObj)
                  {
                      if (false)//你的判断条件
                      {
                          //do what you want...
                          return inObj;
                      }
                      return default(T);
                  }
              }

    这段代码消费者如下:

     var a1 = SomethingFactory<int>.InitInstance(12);
                  Console.WriteLine(a1);
                  Console.ReadKey();

    泛型约束

            很多时候我们不希望使用者太过自由

            我们希望他们在使用我们设计的泛型类型时

            不要很随意的传入任何类型

            对于泛型类型的设计者来说,要求使用者传入指定的类型是很有必要的

            因为我们只有知道他传入了什么东西,才方便对这个东西做操作

            让我们来给上面设计的泛型类型加一个泛型约束

            代码如下:  

    public static class SomethingFactory<T> where T:MyObj

    这样在使用SomethingFactory的时候就只能传入MyObj类型或MyObj的派生类型啦

            注意:

              还可以写成这样

              where T:MyObj,new()

              来约束传入的类型必须有一个构造函数。 

    7、泛型委托  请查看原文。

    8、匿名方法

    9、Lambda表达式

    10、扩展方法

    (1)先决条件

            <1>扩展方法必须在一个非嵌套、非泛型的静态类中定义

            <2>扩展方法必须是一个静态方法

            <3>扩展方法至少要有一个参数

            <4>第一个参数必须附加this关键字作为前缀

            <5>第一个参数不能有其他修饰符(比如ref或者out)

            <6>第一个参数不能是指针类型

    11、迭代器

    注意事项

          <1>做foreach循环时多考虑线程安全性      

            在foreach时不要试图对被遍历的集合进行remove和add等操作

            任何集合,即使被标记为线程安全的,在foreach的时候,增加项和移除项的操作都会导致异常

            (我在这里犯过错)

          <2>IEnumerable接口是LINQ特性的核心接口

            只有实现了IEnumerable接口的集合

            才能执行相关的LINQ操作,比如select,where等

            这些操作,我们接下来会讲到。

    二:LINQ

      1.查询操作符

        (1)源起

          .net的设计者在类库中定义了一系列的扩展方法

          来方便用户操作集合对象

          这些扩展方法构成了LINQ的查询操作符

        (2)使用

          这一系列的扩展方法,比如:

          Where,Max,Select,Sum,Any,Average,All,Concat等

          都是针对IEnumerable的对象进行扩展的

          也就是说,只要实现了IEnumerable接口,就可以使用这些扩展方法

          来看看这段代码: 

     List<int> arr = new List<int>() { 1, 2, 3, 4, 5, 6, 7 };
                var result = arr.Where(a => { return a > 3; }).Sum();
                Console.WriteLine(result);
                Console.ReadKey();

    这段代码中,用到了两个扩展方法。

    <1>

            Where扩展方法,需要传入一个Func<int,bool>类型的泛型委托

            这个泛型委托,需要一个int类型的输入参数和一个布尔类型的返回值

            我们直接把a => { return a > 3; }这个lambda表达式传递给了Where方法

            a就是int类型的输入参数,返回a是否大于3的结果。

    <2>Sum扩展方法计算了Where扩展方法返回的集合的和。

        (3)好处

          上面的代码中

          arr.Where(a => { return a > 3; }).Sum();

          这一句完全可以写成如下代码:

          (from v in arr where v > 3 select v).Sum();

          而且两句代码的执行细节是完全一样的

          大家可以看到,第二句代码更符合语义,更容易读懂

          第二句代码中的where,就是我们要说的查询操作符。

    (4)标准查询操作符说明

    <1>过滤

            Where

            用法:arr.Where(a => { return a > 3; })

            说明:找到集合中满足指定条件的元素

            OfType

            用法:arr.OfType<int>()

            说明:根据指定类型,筛选集合中的元素

    <2>投影

            Select

            用法:arr.Select<int, string>(a => a.ToString());

            说明:将集合中的每个元素投影的新集合中。上例中:新集合是一个IEnumerable<String>的集合

            SelectMany

            用法:arr.SelectMany<int, string>(a => { return new List<string>() { "a", a.ToString() }; });

            说明:将序列的每个元素投影到一个序列中,最终把所有的序列合并

          <3>还有很多查询操作符,请翻MSDN,以后有时间我将另起一篇文章把这些操作符写全。    

    本文摘抄自文章:30分钟LINQ教程

    为个人阅读笔记,省略大量细节精华内容,请移步原文阅读学习。

  • 相关阅读:
    我为什么写博客
    Jquery选中行实现行中的Checkbox的选中与取消选中
    jquery中attr和prop的区别
    如何将.il、.res文件封装成dll文件
    修改VS2010生成的dll文件中的内容
    asp.net mvc4中自定义404页面
    asp.net EF6.0中出现未找到具有固定名称“System.Data.SqlClient”的 ADO.NET提供程序的实体框架提供程序解决办法
    ASP.NET中JSON的序列化和反序列化(转)
     WPF 控件总结
    C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/Tpf386/p/6704374.html
Copyright © 2020-2023  润新知