• c# LINQ 使用


       linq是个好东西,让开发人员省时省力。很多人可能只知道怎么使用, 对它没有全面深入的了解。所谓磨刀不误砍柴工,今天就来学习下。

    一、与LINQ有关的语言特性

      1.扩展方法

       在System.Linq命名空间内有一个Enumerable的静态类,它实现很多方法,且在任何实现IEnumerable<T>的集合对象都有这些方法,这个技术就是扩展方法。

      要点:1.必须是静态类,名称不能和现有的方法冲突;2.至少要有一个扩展类型输入参数,格式为“ this  [类名] [参数名称]”。

     public static class Enumerable
        {
            public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);
        }

      2.匿名类型(Anonymous Type

      以下示例中,其中select new 会自动产生类对象并自动赋值,这个语法包含2个功能:对象初始化器、匿名类型。

    var t = from c in db.Products
                            select new
                            {
                              Name = c.ProductName,
                              Price = c.UnitPrice
                            };

      new关键字之后就直接为对象定义了属性,并且为这些属性赋值,而且,对象创建出来之后,在创建对象的方法中,还可以畅通无阻的访问对象的属性,在序列化和反序列化JSON对象时很有用

      当把一个对象的属性拷贝到匿名对象中时,可以不用显示的指定属性的名字,这时原始属性的名字会被“拷贝”到匿名对象中

      var obj = new {Guid.Empty, myTitle = "匿名类型", myOtherParam = new int[] { 1, 2, 3, 4 } };
             Console.WriteLine(obj.Empty);//另一个对象的属性名字,被原封不动的拷贝到匿名对象中来了。
             Console.WriteLine(obj.myTitle);

      限制:1.一般只用在同一函数内,如要外部使用需通过reflection或者动态类型(dynamic);2.只有属性,不可以有方法、事件、字段等;3.初始化只能利用对象初始化器,生成后是只读属性。

      3.对象初始化器(object initializer)

        它允许在程序中通过声明的方式直接给对象属性进行数值初始化,而不必刻意创建带参构造函数。

    var myObj1 = new MyObj() { id = Guid.NewGuid(), Title = "allen" };
    var myObj1 = new MyObj ("allen") { id = Guid.NewGuid(), Title = "allen" };
    var arr = new List<int>() { 1, 2, 3, 4, 5, 6 };

      4.yield指令

        它是一种编译器魔法,编译时会生成迭代运算的有限状态机。状态机监控对象在“巡航”时所做的访问动作,每次巡航调用触发时才真正进入集合获取数据。

        这个机制让对集合对象的访问推迟到真正查询时才触发,这个机制成为延迟查询。

     private static IEnumerable<int> GetCollection1()
            {
                List<int> list = new List<int>();
                for (var i = 1; i <= 5; i++)
                    list.Add(i);
                return list;
            }
            private static IEnumerable<int> GetCollection2()
            {
                for (var i = 1; i <= 5; i++)
                {
                    if (i > 3)
                        yield break;
                    else
                        yield return i;
                }
            }

       5.Fulent Interface

       Enumerabale 内所包含的LINQ 扩展方法,都返回IEnumerable<T>,这代表可以使用直接串接的方式来调用多个LINQ 函数,而不用为每个函数调用都编写一行程序,这个技术称为Fluent Interface:Fluent Interface 具有三项特性:
    1. 通过调用方法来定义对象内容。
    2. 对象会自我引用(self-referential),且新的对象内容会和最后一个对象内容等价。
    3. 通过返回void 内容(就是null 或不返回最后的对象内容)或非Fluent Interface 的对象结束。
      可以直接对集合进行两次过滤:var query=list.Where(c=>c<10000).Where(c=>c>1000);
      或是提取需要的数据结构:  var query=list.Where(c=>c<10000).Select(c=>new {id=c});
     

      6.lambda

    二、LINQ基础

      1.linq类型

      LINQ分为四类:LINQ to OBJECTS、LINQ to SQL、LINQ to XML、LINQ to DataSet。

       

        2.简单使用

    以下数据源都假设为data

    1.获取某列的不重复数据

    List<int> ids =  data.Select(t => t.ID).Distinct().ToList();

    2.对list进行in查询

    List<int> ids = new List<int>() { 1,2,3};
    List<Entity>  data = data.Where(tb => ids.Contains(tb.ID)).Select(tb => tb).ToList();

    选择指定列

    var data = data.Select(t=>new{ t.id,t.name});

    转换成字典
    var data = data.ToDictionary(key => key.ID, value => value.Name);

    3.排序

      OrderBy(s=>s.Name)  正序

      OrderByDescending(s=>s.Name)  倒序 

      OrderBy(s=>s.Type).ThenBy(s => s.Name)  联合排序

      OrderByDescending(s=>s.Type).ThenBy(s => s.Name)  联合排序

      OrderBy(s=>s.Type).ThenByDescending(s => s.Name)  联合排序
      OrderByDescending(s=>s.Type).ThenByDescending(s => s.Name)  联合排序

      站内相关:Entity framework中LINQ的使用

    参考:

    https://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html

    https://www.cnblogs.com/long-gengyun/p/3929900.html

    http://www.cnblogs.com/xiyin/p/6078385.html

  • 相关阅读:
    因安装包依赖问题导致无法安装的解决办法!
    Ubuntu18.04安装qemu遇到问题-qemu : Depends: qemu-system (>= 1:2.11+dfsg-1ubuntu7)
    理解mount -t proc proc /proc
    printf "%.*s"
    Linux 内核内存分配函数devm_kmalloc()和devm_kzalloc()
    为什么 extern 使用 const 修饰的变量会编译不过?
    php openssl_sign 对应 C#版 RSA签名
    win7中用iis部署ssl服务
    找出windows系统上最大的文件
    windows 创建指定大小文件
  • 原文地址:https://www.cnblogs.com/xcsn/p/5283896.html
Copyright © 2020-2023  润新知