深入理解 c# 第十章 使用Where方法的Lambda表达式去寻找奇数

    class RangeFiltering
    {
        static void Main()
        {
            var collection = Enumerable.Range(0, 10)
                           .Where(x => x % 2 != 0)
                           .Reverse();

            foreach (var element in collection) 
			//collection 为System.Linq.Enumerable.ReverseIterator<int>
			//先foreach  后collection 后 in  后执行 x%2 != 0
			//x为0 1 2 3 4 5 6 7 8 9  返回in
			//后var element 后 WriteLine 后 in  
			//"var element"多次赋值 element 为 9 7 5 3 1
			//之后执行 in, 退出循环
            {
                Console.WriteLine(element);
            }
        }
    }


  Where扩展方法对集合进行过滤的一种简单但又十分强大的方式:它接受一个
谓词,并将其应用于原始集合中的每个元素。Where同样返回一个
IEnumerable<T>,但这一次结果集合中只包含与谓词匹配的元素。
  它先向整数集合应用奇偶过滤器,再对其进行反转。
  我们将方法调用链接到一起了。链接并不是一个新概念。
  扩展方法允许将静态方法调用链接到一起。这是扩展方法存在的主要原因之一。
  强大的地方在于能够以一种自然的方式将静态方法链接起来。这正是.NET 3.5
的扩展方法主要出现在Enumerable和Queryable中的原因:LINQ针对数据
处理进行了专门的调整,将各个单独的操作链接成一条管道,然后让信息在这个
管道中传输。
  如果Reverse和Where不是扩展方法,那么
 

  一种方式是使用一个临时变量,它能保持结构原封不动:

  var collection = Enumerable.Range(0,10);
  collection = Enumerable.Where(collection, x => x%2 != 0)
  collection = Enumerable.Reverse(collection);


 第二种保持"单语句"风格的方式,结果更糟

  var collection = Enumerable.Reverse
		     {Enumerable.Where
			{Enumerable.Range(0,10),
			    x => x%2 != 0));


  方法调用的顺序看起来是反的,因为最里面的方法调用(Range)会先执行,
然后再执行其他的,执行顺序是从内向外的。尽管只有三个方法调用,但还是
异常丑陋。甚至比使用了更多操作符的查询还要糟糕。

  用了扩展方法感觉比较顺眼


		           var collection = Enumerable.Range(0, 10)
                           .Where(x => x % 2 != 0)
                           .Reverse();


输出
9
7
5
3
1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值