zoukankan      html  css  js  c++  java
  • Linq专题之提高编码效率—— 第二篇 神一样的匿名类型

      说起匿名类型,我们都知道这玩意都是为linq而生,而且匿名类型给我们带来的便利性大家在实战中应该都体会到了,特别适合于一次性使用,临时

    使用这些场景,虽然说是匿名类型,也就是说是有类型的,只是匿名了而已,对吧,这篇我们就来探索下匿名类型到底和linq有多大关系呢???

    一:select中的匿名类型

      这个我想大家用的是最多的,毕竟你select之后需要把原始数据重塑成另一种形状展示出来,不信你看嘛!!!

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             var strs = new string[] { "as", "is", "two", "spa" };
     6 
     7             var query = from str in strs
     8                         let temp = str.ToUpper()
     9                         where temp.Contains("S")
    10                         select new { Word = temp, Length = temp.Length };
    11         }
    12     }

    从上面的代码中,你可以看到,原来只是一个string数组,经过linq整合之后就成了一个IEnumerable集合的匿名类集合,并且成功的把每个字符串大写化

    并且统计每个字符串的长度,也体现了匿名类型的临时性。

    二:JavaScriptSerializer 中的匿名类型

         这个类型我想大家都清楚,不过性能更高的方式应该是用JsonConvert吧,但这个不是本篇讨论的话题,我们重点来看看匿名类型的Json序列化能给我们

    带来多大的便利性,比如下面这样:

    1     class Program
    2     {
    3         static void Main(string[] args)
    4         {
    5             JavaScriptSerializer serializer = new JavaScriptSerializer();
    6 
    7             var json = serializer.Serialize(new { Message = "ok", Code = 20001 });
    8         }
    9     }

    从上图中可以看到,其实我并没有显式的定义一个model,而是定义了一个匿名的model,这个model具有Message和Code字段,这样我们就可以直接序

    列化了,是不是很方便呢??

    三:linq中的多键关联

      当我们用linq做两个集合的关联时,会用到on...equals...或者就是两个from...from....where 解决,而且通常情况下只有一个键的关联,比如下面这样:

     1     class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             var productList = new List<Product>()
     6             {
     7                  new Product() { ProductID=1, ProductName="传奇少女2016春秋新款韩版宽松衬衫连衣裙棉麻质感防晒外套风衣女", SupplierID=1 },
     8                  new Product() { ProductID=2, ProductName="衬衫女长袖2016春装新款女装韩范春夏上衣衬衣春季百搭长袖打底衫", SupplierID=1 },
     9                  new Product() { ProductID=3, ProductName="雪纺衬衫女长袖棉立方2016初春新品女装上衣手风琴褶雪纺衫衬衣", SupplierID=2 },
    10             };
    11 
    12             var orderList = new List<Order>
    13             {
    14                 new Order() { OrderID=1000001, OrderName="第一个订单", ProductID=1, SupplierID=1 },
    15                 new Order() { OrderID=1000002, OrderName="第二个订单", ProductID=3, SupplierID=2 },
    16                 new Order() { OrderID=1000003, OrderName="第三个订单", ProductID=2, SupplierID=2 }
    17             };
    18 
    19             var query = from p in productList
    20                         join o in orderList
    21                         on p.ProductID equals o.ProductID
    22                         select new
    23                         {
    24                             ProductID = p.ProductID,
    25                             ProductName = p.ProductID,
    26                             OrderID = o.OrderID,
    27                             OrderName = o.OrderName,
    28                             SupplierID = p.SupplierID
    29                         };
    30         }
    31     }

    由于数据是伪造的,所以就不考虑逻辑性,而是专注于linq语法层次,好了,上面这样的linq,我们看看最后的结果会是怎么样的。

    可以看到我们从数据库中读取到了三条数据,而且这时候我们equal中的条件是on p.ProductID equals o.ProductID,现在需求扑面而来了,如果我

    不仅要判断ProductID,还要判断SupplierID也要相等,这样的需求特么的怎么搞呢??? 那就看看我是怎么搞的哈!!!

     1  var query = from p in productList
     2                         join o in orderList
     3                         on new { ProductID = p.ProductID, SupplierID = p.SupplierID } equals new { ProductID = o.ProductID, SupplierID = o.SupplierID }
     4                         select new
     5                         {
     6                             ProductID = p.ProductID,
     7                             ProductName = p.ProductID,
     8                             OrderID = o.OrderID,
     9                             OrderName = o.OrderName,
    10                             SupplierID = p.SupplierID
    11                         };

    看到没有,标成红色的就是代码的核心,正好我们利用到了匿名类型的equals重写方法,就是因为这个重写解决了多条件的问题,是不是很强大,下面

    再简单看看匿名类型的equals是怎么被重写的。

    从图中可以看到,匿名类型就是追个字段的equals方法比较是否相等的,好了,到现在为止你应该明白了匿名类型对于linq来说是多么的重要啦~~~

  • 相关阅读:
    汉语-词语:慧根
    汉语-词语:悟性
    汉语-汉字:耑
    汉语-汉字:羣
    汉语-词语:觉察
    汉语-词语:醒悟
    汉语-词语:觉悟
    Redhat 5禁止IPv6
    从缓存行出发理解volatile变量、伪共享False sharing、disruptor
    【故障处理141119】一次数据库不繁忙时一条sql语句2个运行计划导致业务超时的故障处理
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/5210606.html
Copyright © 2011-2022 走看看