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