循环中的Union

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

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

ExpandedBlockStart.gif 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

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

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

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

 

转载于:https://www.cnblogs.com/qishichang/archive/2012/03/30/2426222.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值