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时一定要小心,有些时候可能你就用错了。

  • 相关阅读:
    modesim仿真
    EP3C系列FPGA的JTAG检测不了,JTAG下载失败,AS可以下载,下载完成后不执行程序
    本机修改虚拟机linux中的代码文件
    linux中的diff命令
    php中的elseif和else if
    php将数据写入另外一个文件
    IE6下的png不透明问题
    cookie的封装
    php从接口获取数据转成可以用的数组或其他(含转换编码)
    如何让后加载的元素被一开始就有的css样式渲染成功(强制提升css优先级)
  • 原文地址:https://www.cnblogs.com/qishichang/p/2426222.html
Copyright © 2011-2022 走看看