zoukankan      html  css  js  c++  java
  • Linq 构建块

    我们知道Linq是建立在匿名对象,Lamda表达式,拓展方法,对象初始化器等技术上的..........

    那么通过一个简单的Select 拓展方法我来来看一看

                 static IEnumerable<TResult> Select<TResult>(this IEnumerable<TResult> Source,Function<TResult,TResult> Se){
                  
                  foreach(var item in Source)
                  {
                      yield return Se(item);
                  }
                 }  

      我们可以看到拓展的对象是IEnumerable 接口对象,返回的也是IEnumerable,也正是它,才让我们能够在方法中

        使用yield return xx 的语法,也正是yield的延迟加载造就了Linq的神奇

      现在我们来看下例子,更加深入了解Linq的运行 过程

      

            static double Squer(double d)//求一个数的平方
            {
                Console.WriteLine("Computing Squer: " + d);
                return Math.Pow(d, 2);
            }
                double[] d = { 1, 2, 3 };
                var result = from b in d select Squer(b);
                Console.WriteLine("第一次");
                foreach (var item in result)
                {
                    Console.WriteLine(item);
                }

      运行程序查看效果

      

      好像和预料中的没有什么区别!!当我们把鼠标放到result变量上时就可以看到

      那么按照常理来说,item不就应该只是结果吗?那为什么会输出,Computing Squer: x 这些呢?

        这正是yield的神奇之处,我们在来看一个例子

           static IEnumerable<int> dd()
            {
                Console.WriteLine("One.....");
                yield return 1;
                Console.WriteLine("Two.....");
                yield return 2;
                Console.WriteLine("Three.....");
                yield return 3;
            }
                foreach (var item in dd())
                {
                    Console.WriteLine(item);
                }

      这就说明了yield在内存中有个状态

    那如果我把每个元素都改变了在遍历呢?

                Console.WriteLine("每个加2,在查询");
                for (int i = 0; i < d.Length; i++)
                {
                    d[i] = d[i] + 2;
                }
                Console.WriteLine("第二次.....");
                foreach (var item in result)
                {
                    Console.WriteLine(item);
                }

    那我们也就知道了它自动获取到了要查询的值,那么我们怎么样才能马上得到值呢?而不是延迟的....,看下面代码

                foreach (var item in result.ToList())
                {
                    Console.WriteLine(item);
                }

     只是加了一个ToList()我们就可以看到结果发生了变化,根据前面说的,其实result早就知道自己是什么类型的结果集了,那么我就先运行,然后只把结果

      保存在集合里面,那么就会出现上面的情况

    下面在加上常用的查询操作符

    Hold on, everything is possible.
  • 相关阅读:
    Codeforces Round #620 (Div. 2) A-F代码 (暂无记录题解)
    Educational Codeforces Round 82 (Rated for Div. 2) A-E代码(暂无记录题解)
    微信小程序项目踩过的几个坑
    人工智能入门
    2017,知识与财富
    Cesium中Clock控件及时间序列瓦片动态加载
    Cesium基础使用介绍
    geotrellis使用(三十五)Cesium加载geotrellis TMS瓦片
    PhiloGL学习(6)——深情奉献:快乐的一家
    PhiloGL学习(5)——神说要有光,便有了光
  • 原文地址:https://www.cnblogs.com/student-note/p/6519259.html
Copyright © 2011-2022 走看看