走进Linq-Linq to Objects(下)实例篇
[1] 走进Linq-Linq to Objects(下)实例篇
[2] 走进Linq-Linq to Objects(下)实例篇
[3] 走进Linq-Linq to Objects(下)实例篇
[4] 走进Linq-Linq to Objects(下)实例篇
[5] 走进Linq-Linq to Objects(下)实例篇
[6] 走进Linq-Linq to Objects(下)实例篇
[2] 走进Linq-Linq to Objects(下)实例篇
[3] 走进Linq-Linq to Objects(下)实例篇
[4] 走进Linq-Linq to Objects(下)实例篇
[5] 走进Linq-Linq to Objects(下)实例篇
[6] 走进Linq-Linq to Objects(下)实例篇
系列文章导航:
不能不说的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#已经发展到了3.0,但是在2.0里出现的泛型并没有得到全面的普及,很多开发者还是在程序里大量使用1.x里出现的一些非泛型集合,比如ArrayList就是个代表,那么如果存在这样一个集合我们怎么去查询:
ArrayList posts = dataBase.GetAllPosts();
我们知道ArrayList里是Post对象,但是还记得不?Linq里的那些Where啊,Select啊,这些方法都是针对IEnumerable扩展的,而ArrayList实现的是IEmerable这个接口。别急,Linq已经为我们考虑到这点了:
var dataSource = from post in posts.Cast<Post>()
where post.UserName == userName
select post.Title;
where post.UserName == userName
select post.Title;
Cast()方法是对IEnumerable扩展的一个方法,它专门就是干这种转型的事情的,它将遍历非泛型集合中的每个元素,然后把它转型为TResult类型,然后返回一个IEnumerable对象,后面我们就可以使用Linq的其他扩展方法了。但是注意:如果你的非泛型集合里有一个无法转型到TResult类型的元素,那么就要抛出异常了,如果有一个null元素是不会抛出异常的,最终的元素也会是一个null。要不你来保险点,用OfType方法:
var dataSource = from post in posts.OfType<Post>()
where post.UserName == userName
select post.Title;
where post.UserName == userName
select post.Title;
这个方法只会将非泛型集合中那些“是”TResult类型的元素返回来,其它的忽略(这个就不会抛出异常了)。