zoukankan      html  css  js  c++  java
  • linq 的延时执行和即时执行

    举个例子(以下代码是在 linqpad 里面执行的, query.Dump  相当于是在 vs2010 里面的 foreach 循环输出的结果值,也就是输出的意思):


    var
    numbers = new List<int>(); numbers.Add (1); numbers.Dump("List集合的值变成了1个"); IEnumerable<int> query = numbers.Select (n => n * 10); // 建立一个linq查询,默认是延时查询 numbers.Add (2); // 给集合添加一个值,但是这个时候 linq 还未执行,因为延迟查询是在他调用的时候才执行的 numbers.Dump("List集合的值变成了2个"); query.Dump ("注意,这个linq查询返回了2个值,而且都是修改过了的值"); numbers.Dump("List集合的值还是不变的,也就是说 Linq查询是不会改变原来的值的");

    image

    在使用linq的时候,在语句里面使用 ToList 来进行即时查询

    var
    numbers = new List<int>();
    numbers.Add (
    1);

    numbers.Dump(
    "步骤1时的集合值");
    IEnumerable<
    int> query = numbers.Select(n=>n*10).ToList();    // 建立查询语句,注意,这里加多了一个 ToList() 表示立即执行

    numbers.Add (2);                    //  在这里,我们再添加一个进去
    numbers.Dump("步骤2的时候的集合值");

    //用 linqpad 执行上面的 linq 查询
    query.Dump ("linq开始执行!注意:这个时候linq查询就只显示1个值了,而且值还被修改了");

    numbers.Dump(
    "最后");

     

    image

    再演示2个   延时查询   和  立即查询的  例子

    延时查询
    var
    numbers = new List<int>() { 1, 2 };

    IEnumerable<
    int> query = numbers.Select (n => n * 10);   //默认 延时查询,也就是只有它被调用的时候才执行 

    query.Dump ("查询后会显示2个元素,而且是新的元素");

    numbers.Clear();

    query.Dump (
    "查询后显示空,  因为他的原始数据 numbers 被删除了!");

    image

    立即查询


    var
    numbers = new List<int>() { 1, 2 }; List<int> timesTen = numbers .Select (n => n * 10) .ToList(); // 立即执行 返回给 List<int> numbers.Clear(); timesTen.Dump ("因为是立即执行,而不是在调用的时候才延时查询,所以 timesTen的值,还是存在的");

    image

    再来演示,如果是外面的变量修改了,那么延时查询和即时查询的区别


    int
    [] numbers = { 1, 2 }; int factor = 10; IEnumerable<int> query = numbers.Select (n => n * factor); factor = 20; query.Dump ("注意,2个数字都 乘以 20 ,而不是 乘以 10");

    image

    另外有一个问题,是在linqpad里面的演示,好像是错滴,

    IEnumerable<char> query = "Not what you might expect";
     
    query = query.Where (c => c != 'a');
    query = query.Where (c => c != 'e');
    query = query.Where (c => c != 'i');
    query = query.Where (c => c != 'o');
    query = query.Where (c => c != 'u');
     
    new string (query.ToArray()).Dump ("All vowels are stripped, as you'd expect.");
     
    query = "Not what you might expect";
     
    foreach (char vowel in "aeiou")
    {
        query = query.Where (c => c != vowel);
    }
     
    new string (query.ToArray()).Dump ("Notice that only the 'u' is stripped!");

     

    演示说,下面的会仅仅只去掉 U  这个字符,但是实际在我在 linqpad 4.0 里面 显示的都是一样的结果,

    image

    另外还有一个 在 foreach 里面的 linq 语句,却能够执行为 只会去掉一个 U 字符

    IEnumerable<char> query = "Not what you might expect";
    IEnumerable<char> vowels = "aeiou";
    
    IEnumerator<char> rator = vowels.GetEnumerator ();
    char vowel;
    while (rator.MoveNext())
    {
        vowel = rator.Current;
        query = query.Where (c => c != vowel);
    }
    
    query.Dump();

    image

    明天再来研究一下

  • 相关阅读:
    BZOJ 3754 Tree之最小方差树
    【CSS】318- CSS实现宽高等比自适应容器
    【Vuejs】317- 提升90%加载速度——Vuecli下的首屏性能优化
    【H5】316- 移动端H5跳坑指南
    【每周小回顾】2- 一起回顾上周精彩内容
    【Webpack】315- 手把手教你搭建基于 webpack4 的 vue2 多页应用
    【Web技术】314- 前端组件设计原则
    【JS】313- 复习 回流和重绘
    【JS】312- 复习 JavaScript 严格模式(Strict Mode)
    【Canvas】311- 解决 canvas 在高清屏中绘制模糊的问题
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2499739.html
Copyright © 2011-2022 走看看