用LINQ操作内存中的集合
[color=#FF00FF][color=#FF00FF]用LINQ操作内存中的集合
LINQ to Objects是指用LINQ操作内存中对象的集合的方法。但这是什么意思呢?LINQ to Objects支持哪些类型的集合呢?LINQ to Objects又能在这些集合上进行什么操作呢?
本节将从介绍能够与LINQ配合使用的集合类型开始,随后给出这些集合类型所支持的LINQ操作。
4.2.1 能够查询什么
可以预料的是,并不是所有的对象都能够使用LINQ to Objects进行查询,使用LINQ to Objects的首要条件就是将要查询的对象是某种类型的集合。
若想让集合类型能够和LINQ to Objects配合使用,那么只要确保其实现了IEnumerable <T> 接口即可。不要忘记,实现了IEnumerable <T> 接口的对象在LINQ中叫做序列。幸运的是在.NET框架中几乎所有的泛型类型的集合都实现了IEnumerable <T> 接口。这也就意味着LINQ to Objects天生就能够支持那些你早已熟悉的.NET 2.0集合类型。
接下来就来逐一介绍能够通过LINQ to Objects进行查询的集合类型。
1. 数组
包括元素类型为Object在内的所有类型的数组都可以与LINQ to Objects配合使用,如代码清单4-2所示。
代码清单4-2 通过LINQ to Objects查询元素类型为Object的数组(UntypedArray.csproj)
注意 在第2章中我们已经使用过了ObjectDumper类。ObjectDumper是一个非常有用的辅助类,能够显示对象中的数据,随微软公司的LINQ示例代码提供。在本书所附的可下载的源代码中,也能找到该辅助类。
上述代码显示了数组中元素的类型,并按照名称排序。其输出结果如下:
当然,查询也能够应用在元素为自定义类型的数组上。在代码清单4-3中,程序就基于一个元素类型为Book的数组进行了查询。
代码清单4-3 通过LINQ to Objects查询元素为强类型的数组(TypedArray.csproj)
实际上,LINQ to Objects能够应用于任何数据类型的数组。LINQ to Objects还能够支持其他的一些重要集合类型,例如泛型列表、泛型字典等。
2. 泛型列表
毫无疑问,我们在.NET 2.0中最常用到的集合类型就是List <T> ,LINQ to Objects对List <T> 以及其他泛型列表提供了完善的支持。
下面列出了框架所提供的主要泛型列表:
l System.Collections.Generic.List <T>
l System.Collections.Generic.LinkedList <T>
l System.Collections.Generic.Queue <T>
l System.Collections.Generic.Stack <T>
l System.Collections.Generic.HashSet <T>
l System.Collections.ObjectModel.Collection <T>
l System.ComponentModel.BindingList <T>
代码清单4-4就将前面操作于数组的示例程序改为了操作泛型列表。
代码清单4-4 通过LINQ to Objects查询泛型列表
注意到查询语句本身没有作任何的改变,因为无论是数组还是列表都实现了同样的IEnumerable <Book> 接口。而这个接口正是LINQ to Objects查询所依赖的全部基础设施。
虽然最常见的是让LINQ与数组或列表配合使用,不过有时候我们也需要查询泛型字典。
3. 泛型字典
与泛型列表类似的是,所有的泛型字典都支持用LINQ to Objects进行查询:
l System.Collections.Generic.Dictionary <TKey,TValue>
l System.Collections.Generic.SortedDictionary <TKey, TValue>
l System.Collections.Generic.SortedList <TKey, TValue>
泛型字典均实现了IEnumerable <KeyValuePair <TKey, TValue> > 接口,其中的KeyValuePair结构包含了强类型的Key和Value属性。
代码清单4-5演示了查询一个由整型值作为索引、字符串作为值的字典的方法。
代码清单4-5 通过LINQ to Objects查询泛型字典(GenericDictionary.csproj)
上述代码的输出结果将如下所示:
到此为止,我们已经给出了查询中最常见的几种集合。不过,你还可以查询一些其他类型的集合。
4. 字符串
虽然第一眼看上去System.String并不像是个集合,不过它的确实现了IEnumerable <Char> 接口。因此自然可以使用LINQ to Objects对其进行操作——就像操作别的集合类型一样。
注意 在C#中有一个特殊的处理情况,即智能感知将不会自动为System.String给出LINQ相关的扩展方法提示,因为很少有人将System.String作为IEnumerable <Char> 处理。
我们来看一个示例程序。代码清单4-6中的LINQ查询将作用于一个字符串中的各个字符上。
代码清单4-6 通过LINQ to Objects查询字符串(String.csproj)
显然,该程序的运行结果是8。
5. 其他集合
这里我们只列出了.NET框架内建的集合类型。不过,你也可以让LINQ to Objects与其他任何的实现了IEnumerable <T> 接口的集合配合使用。也就是说,LINQ to Objects能够支持我们自定义的,或是其他框架中的集合类型。
一个可能会遇到的问题就是,不是所有的.NET集合类型都实现了IEnumerable <T> 接口。事实上,只有支持强类型的集合才实现了该IEnumerable <T> 接口。数组、泛型列表以及泛型字典都是强类型的,因此我们可以在例如整型数组、字符串列表或包含了Book对象的字典中使用LINQ to Objects。
非泛型的集合类型没有实现IEnumerable <T> ,不过却实现了IEnumerable接口。那么是不是这就意味着我们无法让LINQ支持例如DataSet或ArrayList等非泛型集合了呢?
幸运的是还有别的解决方法。在5.1.1节中,我们将介绍通过Cast和OfType查询操作符对这些非泛型集合类型进行查询的方法。
接下来我们来看一下LINQ支持对这些集合进行哪些操作。
4.2.2 支持的操作
很多标准查询操作符能够操作于上述这些集合类型之上。LINQ引入了一系列的操作符,用来提供处理序列以及组合查询语句的各种不同的方法。
标准查询操作符分为如下几类:约束、投影、分区、连接、排序、分组、集合、转换、等同、元素、生成、数量和聚集。可以看到,LINQ为我们提供了很多的预定义操作。不过这里并不会对其一一进行详细描述。在4.4节将会介绍其中最重要的几个。
需要记住的是这些标准查询操作符均以扩展方法的形式定义于System.Linq.Enumerable类中,并将操作于IEnumerable <T> 类型之上(参见第3章)。
之所以将这些操作符称作标准查询操作符,是因为我们可以自行提供自定义的查询操作符。查询操作符只不过是操作于IEnumerable <T> 之上的扩展方法,因此我们也可以创建自己的操作符,这样即可根据实际需要为LINQ添加新的查询功能。这部分内容将在第12章扩展性相关介绍中出现。
很快我们就会使用一些操作符来执行需要的操作。不过为了能够让实例程序运行起来,首先需要创建一个ASP.NET Web站点和一个Windows Forms应用程序。[/color][color=#FF00FF][/color][/color]
[解决办法]
希望大家好好看看,很有用的哦
[解决办法]
look
[解决办法]
头像不错,还有吗......Linq的话,分清楚IEnumerable和IQueryable接口的区别。另外把Expression搞明白就差不多了。
[解决办法]
不错帮顶
[解决办法]
恩,to object
[解决办法]
接点分。。。
[解决办法]
看msdn更全面
[解决办法]
look
支持msdn
[解决办法]
楼主头像不错
[解决办法]
看到这头像,
其他文字都被无视咯。。。。。
[解决办法]