走进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
我们将查询条件使用委托解决了,只要传递一个接收Book作为参数,返回bool值的方法进去就可以查询满足条件的书籍了,但是,为了这个委托,我们还得先定义一个新方法,然后。。。。太麻烦了,为此C# 2.0为我们提供了匿名方法,专门针对这些只有“一句话方法”:
IList<Book> results = Helper.SearchBook(delegate(Book book) { return book.Title == "yuyi"; });
代码是减少不少,可这种写法还是不“人性化”,这还是一种人向计算机妥协的结果,才产生了这种怪异的写法,如是C# 3.0给我们提供了Lambda表达式:
IList<Book> results = Helper.SearchBook(book => book.Title == "yuyi");
代码更短了,写法也越来越向人类语言靠近了(这也许就是计算机语言的发展历史,随着计算机越来越智能,总有一天必会是计算机向人类妥协)。
不过这里还有一点不爽,每一次调用这个查找方法都要带Helper,要是IList自己就这个方法该多好。这个想法很好,C# 3.0里还为我们提供了扩展方法:
public static class Helper
{
public delegate bool Condtion(Book book);
public static IList<Book> Where(this IList<Book> books,Condtion condition)
{
IList < Book > results = new List<Book>();
foreach (Book book in books)
{
if (condition(book))
{
results.Add(book);
}
}
return results;
}
}
{
public delegate bool Condtion(Book book);
public static IList<Book> Where(this IList<Book> books,Condtion condition)
{
IList < Book > results = new List<Book>();
foreach (Book book in books)
{
if (condition(book))
{
results.Add(book);
}
}
return results;
}
}