LINQ to objects
LINQ to Objects是LINQ提供的最简单的一组功能,使用LINQ to Objects可以直接操作IEnumerable或IEnumerable<T>集合,而不需要LINQ提供程序或API。
9.1 LINQ to Objects概述
使用LINQ to Objects可以直接操作IEnumerable或IEnumerable<T>集合,而不需要LINQ提供程序或API。使用LINQ可以查询任何可枚举的集合,如数组、泛型列表List<T>、泛型字典Dictionary<T>等,以及用户自定义的集合。
9.2 使用LINQ操作集合
LINQ能够操作.NET Framework提供的绝大多数集合,如静态数组、动态数组、泛型列表、泛型排序列表、泛型双向列表、泛型队列、泛型堆栈、泛型哈希集、泛型字典、泛型排序字典、泛型通用集合、泛型绑定列表等。LINQ能够对这些集合实现筛选、排序、分组等功能。
1 操作静态数组:静态数组是指长度不能改变的数组。如果数组的类型不是基础类型,那么在查询数组时,需要显式指定范围变量的类型,从而指定元素的特定类型。
2 操作动态数组:动态数组是指长度可以修改的数组,如ArrayList等。和静态数组一样,如果动态数组的类型不是基础类型,那么在查询数组时,需要显式指定范围变量的类型,从而指定元素的特定类型
3 操作泛型列表List<T>:泛型列表List<T>(T表示数据类型)能够通过索引访问对象的强类型列表。
4 操作泛型排序列表SortedList<Tkey,TValue>
泛型排序列表SortedList<TKey,Tvalue>是由”键/值”对(KeyValuePair<TKey,TValue>组成的集合,且集合中的元素按照键值进行排序。泛型排序列表SortedList<TKey,TValue>具有以下4个特点。
(1) SortedList<TKey,TValue>按键值进行排序,每一个元素为KeyValuePair<TKey,TValue>对象
(2) SortedList<TKey,TValue>中键不能修改,不能为空,且值唯一
(3) SortedList<TKey,TValue>中元素的值可以为空
(4) SortedList<TKey,TValue>使用比较器来实现排序和比较操作
5 操作泛型双向链表LinkedList<T>
泛型双向链表LinkedList<T>表示双向链表,它通过当前元素可以直接访问该元素的前一个(如果存在)和后一个元素(如果存在)。其中,元素的类型为LinkedListNode<T>。泛型双向链表LinkedList<T>具有以下3个特点:
(1) LinkedList<T>节点的类型为LinkedListNode<T>,并且每个节点向前指向Next节点,向后指向Previous节点
(2) LinkedList<T>可以根据当前节点直接操作该节点的前一个节点(如果存在)和后一个节点(如果存在)
(3) 如果LinkedList<T>为空,则其First和Last属性的值也为空
6 操作泛型队列Queue<T>
泛型队列Queue<T>和普通队列一样,也是一种先进先出的线性表。队列的常用操作包括:元素入队(Enqueue()方法)、元素出队(Dequeue()方法)、清空队列(Clear()方法)等。泛型队列Queue<T>具有以下3个特点:
(1) 加入元素到Queue<T>操作称为入队,从Queue<T>中删除元素操作称为出队
(2) Queue<T>具有先进先出的特点,即元素进入队列的顺序和元素从队列中删除元素的顺序一致
(3) Queue<T>允许具有重复的元素,而且还可以包含空元素
7 操作泛型堆栈Stack<T>
泛型堆栈Stack<T>和普通堆栈一样,也是一种限定在表尾进行插入和删除的线性表。堆栈的常用操作包括元素入栈(Push()方法)、元素出栈(Pop())方法、清空堆栈(Clear()方法)等。泛型堆栈Stack<T>具有以下3个特点:
(1) 加入元素到Stack<T>操作称为入栈,从Stack<T>中删除元素操作称为出栈
(2) Stack<T>具有先进后出的特点,即元素进入堆栈的顺序和元素从堆栈中删除的顺序恰好相反
(3) Stack<T>允许具有重复的元素,且还可以包含空元素
8 操作泛型哈希集HashSet<T>
哈希集合HashSet<T>类基于集合的模型,可提供高性能集合运算,如并集、交集等。其访问方式类和Dictionary<TKey,TValue>或Hashtable集合类似。哈希集合Hash<T>具有以下3个特点:
(1) HashSet<T>集合不能包含重复元素
(2) HashSet<T>集合不考虑排序
(3) HashSet<T>提供多个集合操作,如并集、交集、补集等
9 操作泛型字典Dictionary<TKey,TValue>
泛型字典Dictionary<TKey,TValue>是由”键/值”对(KeyValuePair<TKey,TValue>)组成的集合,类似于现实中的字典。泛型字典具有以下4个特点:
(1) Dictionary<TKey,TValue>中的元素的类型为KeyValuePair<TKey,TValue>
(2) Dictionary<TKey,TValue>中的键不能修改、不能为空、且值唯一
(3) Dictionary<TKey,TValue>中的元素的值可以为空
(4) Dictionary<TKey,TValue>使用比较器来实现比较操作
10 操作泛型排序字典SortedDictionary<TKey,TValue>
泛型排序字典SortedDictionary<TKey,TValue>是由“键/值”对组成的集合,且集合中的元素按照键值进行排序。泛型排序字典具有以下4个特点:
(1) SortedDictionary<TKey,TValue>按键值进行排序,每一个元素为KeyValuePair<Tkey,TValue>对象
(2) SortedDictionary<TKey,TValue>中键是不能修改,不能为空,且值唯一
(3) SortedDictionary<TKey,TValue>中元素的值可以为空
(4) SortedDictionary<TKey,TValue>使用比较器来实现排序和比较操作
11 操作泛型通用集合Collection<T>
泛型通用集合Collection<T>和泛型列表List<T>非常相似,能够通过索引访问对象的强类型列表。特别地,Collection<T>类还可以作为集合类型的基类使用,用户可以使用该类派生自定义的集合类。泛型通用集合Collection<T>具有以下两个特点:
(1) 访问Collection<T>中的元素可以通过索引实现,且索引从0开始
(2) Collection<T>类一般作为集合的基类,用户可以扩展该类实现自定义集合类
12 操作泛型绑定列表BindingList<T>
泛型绑定列表BindingList<T>能够提供支持数据绑定的泛型集合,它提供了IBindingList接口的具体泛型实现,可以用作创建双向数据绑定机制的基类,还可以通过AddNew()方法支持工厂创建的实例
9.3 使用LINQ操作字符串
使用LINQ不但可以操作集合,而且还可以操作字符串或字符串集合,
从字符串中查找指定的字符、从文本中查找指定的字符串、统计单词出现
的次数(词频统计)等。另外,使用LINQ还可以结合正则表达式来处理字
符串。
(1) 查找指定的字符
(2) 查找指定的字符串
(3) 词频统计(统计给定文本中每一个单词出现的次数)
(4) 使用正则表达式处理字符串
9.4 使用LINQ操作文件目录
在Windows文件系统中,往往需要在文件夹(或文件目录)中查询指定名称的文件、指定属性的文件、指定扩展名的文件等。这些操作往往都是查询操作,因此非常适合使用LINQ实现。本小节介绍使用LINQ操作文件目录的方法,如统计文件的大小、比较两个文件夹是否存在相同文件、查找指定名称(或扩展名、属性)的文件等。
(1) 查询指定名称的文件(从指定目录中查询指定名称的文件)
(2) 查询指定扩展名的文件
(3) 查询指定属性的文件
(4) 统计文件夹的大小
(5) 比较两个文件夹下是否存在同名文件
(6) 查询文件夹所有文件的内容