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

  • 相关阅读:
    Exception in thread "main" java.io.IOException: Cannot run program "XX": CreateProcess error
    用eclipse打包mapreduce程序 运行出现解析路径错误的诡异问题
    HTMLParser学习笔记(一)
    Prim算法实现
    hadoop mapreduce 出现找不到 各种类的错误
    搜索引擎的基本原理
    ArrayList 和数组 在mapreduce编程中序列化
    读《做你自己》
    对于通过视频学习编程的建议
    长篇文档排版技巧
  • 原文地址:https://www.cnblogs.com/qishichang/p/2426222.html
Copyright © 2011-2022 走看看