zoukankan      html  css  js  c++  java
  • 循环中的Union

    前几天同事遇到这样一个问题。在循环中使用了Union,但最后的结果和预期的不一样。

    下面的代码仅为问题的重现,没有实际意义

    View Code
     1   class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             var list = new[] { 12345 };
     6             var first = list.Where(l => l == 1);
     7             foreach (var li in list)
     8             {
     9                 first = first.Union(list.Where(l => l == li));
    10             }
    11 
    12             first.ToList().ForEach(l => Console.Write("{0}\t", l));
    13             Console.WriteLine();
    14         }
    15     }

    以下是结果:

    预期的结果应该是:1 2 3 4 5

    为什么实际的结果和预期的结果不同呢?

    我们对代码进行了如下修改:

    View Code
     class Program
        {
            static void Main(string[] args)
            {
                var list = new[] { 12345 };
                var first = list.Where(l => l == 1);
                foreach (var li in list)
                {
                    // 原代码
                    
    // first = first.Union(list.Where(l => l == li));

                    
    // 修改后的代码
                    first = first.Union(list.Where(l => l == li).ToList());
                }

                first.ToList().ForEach(l => Console.Write("{0}\t", l));
                Console.WriteLine();
            }
        }

    以下是结果:

    这次结果和预期相同。

    这两次的不同之处就在于,在第二次中对查询通过调用ToList()方法进行了立即执行。

    在一次的查询过程中,只拼接了查询,而在变量first.ToList()时才执行了查询,执行查询需要用到变量li,而最后li的值为5。所以最终结果也就成了1 5,而不是开始预期的1 2 3 4 5.

    总结,所以在使用Linq时一定要小心,有些时候可能你就用错了。

  • 相关阅读:
    【目录】循序渐进学.Net Core Web Api开发系列
    UML各种图总结-精华
    UML各种线的含义
    最新10大Python面试常问的问题,60%的人都不会
    Java—线程池ThreadPoolExecutor案例详解,高薪必备
    HashMap 的 7 种遍历方式与性能分析,高薪必学
    DelayQueue核心源码解析,Java面试必学
    Spring源码-循环依赖,Java架构师必学
    JAVA编程思想,去掉别扭的if,自注册策略模式优雅满足开闭原则,80%的人都不知道
    用Python实现植物大战僵尸游戏,很酷
  • 原文地址:https://www.cnblogs.com/qishichang/p/2426222.html
Copyright © 2011-2022 走看看