您的位置:知识库 » 数据库

走进Linq-Linq to Objects(下)实例篇

作者: 横刀天笑  来源: 博客园  发布时间: 2008-09-23 18:39  阅读: 14803 次  推荐: 3   原文链接   [收藏]  

系列文章导航:

走进Linq--Linq横空出世篇

走进Linq-辉煌的背后

走进Linq-Linq大观园

不能不说的C#特性-对象集合初始化器

不能不说的C#特性-匿名类型与隐式类型局部变量

不能不说的C#特性-扩展方法

不能不说的C#特性-匿名方法和Lambda表达式

不能不说的C#特性-迭代器(上)及一些研究过程中的副产品

不能不说的C#特性-迭代器(下),yield以及流的延迟计算

走进Linq-Linq to Objects(上)基础篇

走进Linq-Linq to Objects(下)实例篇

走进Linq-Linq to SQL感性认识篇

走进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-How do I(4)拾遗补零篇第一节

走进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;

Cast()方法是对IEnumerable扩展的一个方法,它专门就是干这种转型的事情的,它将遍历非泛型集合中的每个元素,然后把它转型为TResult类型,然后返回一个IEnumerable对象,后面我们就可以使用Linq的其他扩展方法了。但是注意:如果你的非泛型集合里有一个无法转型到TResult类型的元素,那么就要抛出异常了,如果有一个null元素是不会抛出异常的,最终的元素也会是一个null。要不你来保险点,用OfType方法:

var dataSource = from post in posts.OfType<Post>()
           
where post.UserName == userName
           select post.Title;

这个方法只会将非泛型集合中那些“是”TResult类型的元素返回来,其它的忽略(这个就不会抛出异常了)。

3
0
标签:linq objects

数据库热门文章

    数据库最新文章

      最新新闻

        热门新闻