走进Linq-Linq大观园
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
C#对Linq的语言层面支持
使用
result = books.Where(book=>book.Title.StartsWith("I"))
.OrderBy(book=>book.Price)
.Select(book=>new{Key=book.Title,Value=book.Price});
.OrderBy(book=>book.Price)
.Select(book=>new{Key=book.Title,Value=book.Price});
这种方式编写代码,虽然减少了不少工作量,并且编程风格也更加人性化,不过现在C#为我们提供了一些列非常有用的关键字。上面的代码现在你可以这样来编写:
result = from book in books
where book.Title.StartsWith("I")
orderby book.Price
select new { Key=book.Title,Value = book.Price};
where book.Title.StartsWith("I")
orderby book.Price
select new { Key=book.Title,Value = book.Price};
from关键字后面跟着的是Func委托的输入参数,in关键字后面跟着一个IEnumerable类型,where,orderby,select对应着那些扩展方法,那些扩展方法接受的委托的输入参数就是from后面的book。实际上你可以把这些代码写成一行意思就更明显了:
result = from book in books where book.Title.StartsWith("I") orderby book.Price select new { Key=book.Title,Value = book.Price};
从books集合里枚举一个book,如果这个book的标题是以”I”开头的就把它加入到返回集合中,并把返回集合按照book的价钱排序将上面的代码编译后的程序集用Reflector反编译,生成的代码是:
books.Where<Book>(delegate(Book book)
{
return book.Title.StartsWith("I");
}).OrderBy<Book, float>(delegate(Book book)
{
return book.Price;
}).Select(delegate(Book book)
{
return new { Key = book.Title, Value = book.Price };
});
{
return book.Title.StartsWith("I");
}).OrderBy<Book, float>(delegate(Book book)
{
return book.Price;
}).Select(delegate(Book book)
{
return new { Key = book.Title, Value = book.Price };
});
看来这种方式写和扩展方法调用的方式没有什么差别,那为什么不呢。