转自:https://blog.csdn.net/qq_21419015/article/details/80495322
IEnumerable 和IEnumerable<T> 接口在 .NET 中是非常重要的接口,它允许开发人员定义foreach语句功能的实现并支持非泛型方法的简单的迭代,IEnumerable和IEnumerable<T>接口是 .NET Framework 中最基本的集合访问器。它定义了一组扩展方法,用来对数据集合中的元素进行遍历、过滤、排序、搜索等操作。
IEnumerable接口是非常的简单,只包含一个抽象的方法Get IEnumerator(T),它返回一个可用于循环访问集合的IEnumerator对象。
IEnumerable、IEnumerator、ICollection、IList、List
IEnumerator:提供在普通集合中遍历的接口,有Current,MoveNext(),Reset(),其中Current返回的是object类型。
IEnumerable: 暴露一个IEnumerator,支持在普通集合中的遍历。
IEnumerator<T>:继承自IEnumerator,有Current属性,返回的是T类型。
IEnumerable<T>:继承自IEnumerable,暴露一个IEnumerator<T>,支持在泛型集合中遍历。
扩展方法如下表所示:
名称 | 说明 | |
---|---|---|
Aggregate |
已重载。 对一个序列应用累加器函数。(由 Enumerable 定义。) |
|
Aggregate |
已重载。 对一个序列应用累加器函数。 将指定的种子值用作累加器初始值。(由 Enumerable 定义。) |
|
Aggregate |
已重载。 对一个序列应用累加器函数。 将指定的种子值用作累加器的初始值,并使用指定的函数选择结果值。(由 Enumerable 定义。) |
|
All |
确定是否对序列中的所有元素都满足条件。(由 Enumerable 定义。) |
|
Ancestors |
已重载。 返回包含与源集合中的每个节点的上级元素的集合。(由 Extensions 定义。) |
|
Ancestors |
已重载。 返回经过筛选的元素集合,其中包含对源集合中的每个节点的上级。 仅具有匹配的元素 XName 包括在集合中。(由 Extensions 定义。) |
|
Any |
已重载。 确定序列是否包含任何元素。(由 Enumerable 定义。) |
|
Any |
已重载。 确定是否序列中的任何元素都满足条件。(由 Enumerable 定义。) |
|
AsEnumerable |
返回输入类型化为 IEnumerable。(由 Enumerable 定义。) |
|
AsParallel |
已重载。 启用查询的并行化。(由 ParallelEnumerable 定义。) |
|
AsQueryable |
已重载。 将转换泛型 IEnumerable 于泛型 IQueryable。(由 Queryable 定义。) |
|
Average |
已重载。 计算序列的平均值 Decimal 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 计算序列的平均值 Double 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 计算序列的平均值 Int32 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 计算序列的平均值 Int64 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 可以为 null 的序列的平均值,计算 Decimal 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 可以为 null 的序列的平均值,计算 Double 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 可以为 null 的序列的平均值,计算 Int32 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 可以为 null 的序列的平均值,计算 Int64 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 可以为 null 的序列的平均值,计算 Single 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Average |
已重载。 计算序列的平均值 Single 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Cast |
将强制转换的元素 IEnumerable 为指定的类型。(由 Enumerable 定义。) |
|
Concat |
连接两个序列。(由 Enumerable 定义。) |
|
Contains |
已重载。 确定序列是否包含指定的元素使用的默认相等比较器。(由 Enumerable 定义。) |
|
Contains |
已重载。 确定序列是否使用指定的包含指定的元素 IEqualityComparer。(由 Enumerable 定义。) |
|
CopyToDataTable |
已重载。 返回 DataTable ,其中包含的副本 DataRow 对象,给定输入 IEnumerable 对象其中泛型参数 T 是 DataRow。(由 DataTableExtensions 定义。) |
|
CopyToDataTable |
已重载。 副本 DataRow 对象传递给指定 DataTable, ,给定输入 IEnumerable 对象其中泛型参数 T 是 DataRow。(由 DataTableExtensions 定义。) |
|
CopyToDataTable |
已重载。 副本 DataRow 对象传递给指定 DataTable, ,给定输入 IEnumerable 对象其中泛型参数 T 是 DataRow。(由 DataTableExtensions 定义。) |
|
Count |
已重载。 返回序列中的元素数。(由 Enumerable 定义。) |
|
Count |
已重载。 返回一个数字来表示多少个元素指定序列中的满足条件。(由 Enumerable 定义。) |
|
DefaultIfEmpty |
已重载。 返回单一实例集合中指定的序列或类型参数的默认值的元素,如果序列为空。(由 Enumerable 定义。) |
|
DefaultIfEmpty |
已重载。 返回单一实例集合中指定的序列或指定的值的元素,如果序列为空。(由 Enumerable 定义。) |
|
DescendantNodes |
返回源集合中的每个文档和元素的子代节点的集合。(由 Extensions 定义。) |
|
Descendants |
已重载。 返回元素的集合,其中包含每个元素和文档与源集合中的子代元素。(由 Extensions 定义。) |
|
Descendants |
已重载。 返回经过筛选的元素集合,其中包含每个元素和文档与源集合中的子代元素。 仅具有匹配的元素 XName 包括在集合中。(由 Extensions 定义。) |
|
Distinct |
已重载。 通过使用的默认相等比较器对值进行比较从序列返回非重复元素。(由 Enumerable 定义。) |
|
Distinct |
已重载。 返回序列中通过使用指定的非重复元素 IEqualityComparer 对值进行比较。(由 Enumerable 定义。) |
|
ElementAt |
返回序列中的指定索引处的元素。(由 Enumerable 定义。) |
|
ElementAtOrDefault |
返回序列中指定索引处的元素;如果索引超出范围,则返回默认值。(由 Enumerable 定义。) |
|
Elements |
已重载。 返回源集合中的每个元素和文档的元素的子集合。(由 Extensions 定义。) |
|
Elements |
已重载。 源集合中返回经过筛选的子集合元素的每个元素和文档。 仅具有匹配的元素 XName 包括在集合中。(由 Extensions 定义。) |
|
Except |
已重载。 通过使用默认的相等比较器对值进行比较,生成两个序列的差集。(由 Enumerable 定义。) |
|
Except |
已重载。 使用指定的生成两个序列的差集 IEqualityComparer 对值进行比较。(由 Enumerable 定义。) |
|
First |
已重载。 返回一个序列的第一个元素。(由 Enumerable 定义。) |
|
First |
已重载。 返回序列中满足指定条件的第一个元素。(由 Enumerable 定义。) |
|
FirstOrDefault |
已重载。 返回序列中的第一个元素;如果序列中不包含任何元素,则返回默认值。(由 Enumerable 定义。) |
|
FirstOrDefault |
已重载。 返回序列中满足条件的第一个元素;如果未找到这样的元素,则返回默认值。(由 Enumerable 定义。) |
|
GroupBy |
已重载。 根据指定的键选择器函数对序列的元素进行分组。(由 Enumerable 定义。) |
|
GroupBy |
已重载。 根据指定的键选择器函数并将进行比较的键使用指定的比较器对序列的元素进行分组。(由 Enumerable 定义。) |
|
GroupBy |
已重载。 根据指定的键选择器函数和项目的元素的每个组通过使用指定的函数对序列的元素进行分组。(由 Enumerable 定义。) |
|
GroupBy |
已重载。 根据键选择器函数对序列的元素进行分组。 通过使用比较器对键进行比较,并且通过使用指定的函数对每个组的元素进行投影。(由 Enumerable 定义。) |
|
GroupBy |
已重载。 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。(由 Enumerable定义。) |
|
GroupBy |
已重载。 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。 通过使用指定的比较器对键进行比较。(由 Enumerable 定义。) |
|
GroupBy |
已重载。 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。 通过使用指定的函数对每个组的元素进行投影。(由 Enumerable 定义。) |
|
GroupBy |
已重载。 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。 通过使用指定的比较器对键值进行比较,并且通过使用指定的函数对每个组的元素进行投影。(由 Enumerable 定义。) |
|
GroupJoin |
已重载。 基于键相等对两个序列的元素进行关联,并对结果进行分组。 使用默认的相等比较器对键进行比较。(由 Enumerable 定义。) |
|
GroupJoin |
已重载。 基于键相等对两个序列的元素进行关联,并对结果进行分组。 指定 IEqualityComparer 用来对键进行比较。(由 Enumerable 定义。) |
|
InDocumentOrder |
返回包含按文档顺序排序的源集合中的所有节点的节点集合。(由 Extensions 定义。) |
|
Intersect |
已重载。 通过使用的默认相等比较器对值进行比较,生成两个序列的交集。(由 Enumerable 定义。) |
|
Intersect |
已重载。 使用指定的生成两个序列的交集IEqualityComparer值进行比较。(由 Enumerable 定义。) |
|
Join |
已重载。 基于匹配键对两个序列的元素关联。 使用默认的相等比较器对键进行比较。(由 Enumerable 定义。) |
|
Join |
已重载。 基于匹配键对两个序列的元素关联。 指定 IEqualityComparer 用来对键进行比较。(由 Enumerable 定义。) |
|
Last |
已重载。 返回一个序列的最后一个元素。(由 Enumerable 定义。) |
|
Last |
已重载。 返回序列中满足指定条件的最后一个元素。(由 Enumerable 定义。) |
|
LastOrDefault |
已重载。 返回序列中的最后一个元素;如果序列中不包含任何元素,则返回默认值。(由 Enumerable 定义。) |
|
LastOrDefault |
已重载。 返回序列中满足条件的最后一个元素;如果未找到这样的元素,则返回默认值。(由 Enumerable 定义。) |
|
LongCount |
已重载。 返回Int64表示序列中的元素总数。(由 Enumerable 定义。) |
|
LongCount |
已重载。 返回 Int64 表示序列中的多少个元素满足条件。(由 Enumerable 定义。) |
|
Max |
已重载。 泛型序列中返回的最大值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大 Decimal 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大 Double 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大 Int32 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大 Int64 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大可以为 null Decimal 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大可以为 null Double 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大可以为 null Int32 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大可以为 null Int64 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大可以为 null Single 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用转换函数对序列的每个元素并返回最大 Single 值。(由 Enumerable 定义。) |
|
Max |
已重载。 调用泛型序列的每个元素的转换函数并返回最大结果值。(由 Enumerable 定义。) |
|
Min |
已重载。 泛型序列中返回的最小值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回所需的最低 Decimal 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回所需的最低 Double 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回所需的最低 Int32 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回所需的最低 Int64 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回最小值可以为 null Decimal 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回最小值可以为 null Double 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回最小值可以为 null Int32 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回最小值可以为 null Int64 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回最小值可以为 null Single 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用转换函数对序列的每个元素,并返回所需的最低 Single 值。(由 Enumerable 定义。) |
|
Min |
已重载。 调用泛型序列的每个元素的转换函数,并返回最小的结果值。(由 Enumerable 定义。) |
|
Nodes |
返回源集合中的每个文档和元素节点的子集合。(由 Extensions 定义。) |
|
OfType |
筛选的元素 IEnumerable 根据指定的类型。(由 Enumerable 定义。) |
|
OrderBy |
已重载。 按根据某个键按升序对序列的元素进行排序。(由 Enumerable 定义。) |
|
OrderBy |
已重载。 按使用指定的比较器按升序对序列的元素进行排序。(由 Enumerable 定义。) |
|
OrderByDescending |
已重载。 按根据某个键按降序对序列的元素进行排序。(由 Enumerable 定义。) |
|
OrderByDescending |
已重载。 使用指定的比较器按降序对序列的元素排序。(由 Enumerable 定义。) |
|
Remove |
已重载。 从其父节点与源集合中删除每个节点。(由 Extensions 定义。) |
|
Reverse |
反转序列中元素的顺序。(由 Enumerable 定义。) |
|
Select |
已重载。 将序列中的每个元素投影到新表单。(由 Enumerable 定义。) |
|
Select |
已重载。 通过合并元素的索引投影到一个新窗体的序列的每个元素。(由 Enumerable 定义。) |
|
SelectMany |
已重载。 一个序列的每个元素投影 IEnumerable 并将合并为一个序列将结果序列。(由 Enumerable 定义。) |
|
SelectMany |
已重载。 一个序列的每个元素投影 IEnumerable, ,并将合并为一个序列将结果序列。 每个源元素的索引用于该元素的投影表。(由 Enumerable 定义。) |
|
SelectMany |
已重载。 一个序列的每个元素投影 IEnumerable, 将平展为一个序列,将结果序列,其中调用结果选择器函数对每个元素。(由 Enumerable 定义。) |
|
SelectMany |
已重载。 一个序列的每个元素投影 IEnumerable, 将平展为一个序列,将结果序列,其中调用结果选择器函数对每个元素。 每个源元素的索引用于该元素的中间投影表。(由 Enumerable 定义。) |
|
SequenceEqual |
已重载。 确定两个序列是否相等的元素进行比较通过使用相应类型的默认相等比较器。(由 Enumerable 定义。) |
|
SequenceEqual |
已重载。 确定两个序列是否通过使用指定的比较它们的元素相等 IEqualityComparer。(由 Enumerable 定义。) |
|
Single |
已重载。 返回序列的唯一元素;如果该序列并非恰好包含一个元素,则会引发异常。(由 Enumerable 定义。) |
|
Single |
已重载。 返回序列中满足指定条件的唯一元素;如果有多个这样的元素存在,则会引发异常。(由 Enumerable 定义。) |
|
SingleOrDefault |
已重载。 返回一个序列,或默认值的唯一元素,如果序列为空,则为如果序列中存在多个元素,则此方法将引发异常。(由 Enumerable 定义。) |
|
SingleOrDefault |
已重载。 返回序列中满足指定条件的唯一元素;如果这类元素不存在,则返回默认值;如果有多个元素满足该条件,此方法将引发异常。(由 Enumerable 定义。) |
|
Skip |
跳过指定的数量的序列中的元素,然后返回剩余元素。(由 Enumerable 定义。) |
|
SkipWhile |
已重载。 只要指定的条件为 true,然后返回剩余元素,跳过序列中的元素。(由 Enumerable 定义。) |
|
SkipWhile |
已重载。 只要指定的条件为 true,然后返回剩余元素,跳过序列中的元素。 将在谓词函数的逻辑中使用元素的索引。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算的序列的和 Decimal 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算的序列的和 Double 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算的序列的和 Int32 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算的序列的和 Int64 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算可以为 null 的序列的和 Decimal 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算可以为 null 的序列的和 Double 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算可以为 null 的序列的和 Int32 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算可以为 null 的序列的和 Int64 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算可以为 null 的序列的和 Single 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Sum |
已重载。 计算的序列的和 Single 通过调用对输入序列中的每个元素的转换函数获得的值。(由 Enumerable 定义。) |
|
Take |
从序列的开头返回指定的数量的连续元素。(由 Enumerable 定义。) |
|
TakeWhile |
已重载。 返回序列中的元素,只要指定的条件为真。(由 Enumerable 定义。) |
|
TakeWhile |
已重载。 返回序列中的元素,只要指定的条件为真。 将在谓词函数的逻辑中使用元素的索引。(由 Enumerable 定义。) |
|
ToArray |
创建一个数组,从 IEnumerable。(由 Enumerable 定义。) |
|
ToDictionary |
已重载。 创建 Dictionary 从 IEnumerable 根据指定的键选择器函数。(由 Enumerable 定义。) |
|
ToDictionary |
已重载。 创建 Dictionary 从 IEnumerable 根据指定的键选择器函数和键比较器。(由 Enumerable 定义。) |
|
ToDictionary |
已重载。 创建 Dictionary 从 IEnumerable 根据指定的键选择器和元素选择器函数。(由 Enumerable 定义。) |
|
ToDictionary |
已重载。 创建 Dictionary 从 IEnumerable 根据指定的键选择器函数、 比较器和元素选择器函数。(由 Enumerable 定义。) |
|
ToList |
创建 List 从 IEnumerable。(由 Enumerable 定义。) |
|
ToLookup |
已重载。 创建 Lookup 从 IEnumerable 根据指定的键选择器函数。(由 Enumerable 定义。) |
|
ToLookup |
已重载。 创建 Lookup 从 IEnumerable 根据指定的键选择器函数和键比较器。(由 Enumerable 定义。) |
|
ToLookup |
已重载。 创建 Lookup 从 IEnumerable 根据指定的键选择器和元素选择器函数。(由 Enumerable 定义。) |
|
ToLookup |
已重载。 创建 Lookup 从 IEnumerable 根据指定的键选择器函数、 比较和元素选择器函数。(由 Enumerable 定义。) |
|
Union |
已重载。 通过使用默认的相等比较器生成的两个序列的并集。(由 Enumerable 定义。) |
|
Union |
已重载。 使用指定的生成两个序列的并集 IEqualityComparer。(由 Enumerable 定义。) |
|
Where |
已重载。 基于谓词筛选值序列。(由 Enumerable 定义。) |
|
Where |
已重载。 基于谓词筛选值序列。 将在谓词函数的逻辑中使用每个元素的索引。(由 Enumerable 定义。) |
|
Zip |
适用于两个序列,生成的结果序列的相应元素指定的函数。(由 Enumerable 定义。) |
下面列举几个扩展方法实现的示例:(VS 2014 环境)
示例1:
Sum扩展方法:
新建如下几个类:
book.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IEnumerableSum
{
/// <summary>
/// 数据模型
/// </summary>
public class Book
{
public string Name { get; set; }
public decimal Price { get; set; }
}
}
Shopping.cs 如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IEnumerableSum
{
/// <summary>
/// 表示 Book 对象集合
/// </summary>
public class Shopping
{
private ValueCalculator vc; public Shopping(ValueCalculator vcParam)
{
vc = vcParam;
}
public IEnumerable<Book> Books { get; set; } public decimal CalculateBookTotal()
{
return vc.ValueBooks(Books);
}
}
}
ValueCalculator.cs 如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IEnumerableSum
{
public class ValueCalculator
{
/// <summary>
/// 定义了一个单一的方法ValueBooks,使用了IEnumerable的Sum方法将传递给该方法的可枚举对象中每一个 Book 对象的Price 属性值在一起
/// </summary>
/// <param name="books">该方法的可枚举对象</param>
/// <returns></returns>
public decimal ValueBooks(IEnumerable<Book> books)
{
return books.Sum(b => b.Price);
}
}
}
PS: 如果不理解 books.Sum(b => b.Price) ,可以查看 C# lambda 表达式。也可以擦汗查看本人MVC中的 lambda 案例,参阅
ASP.NET + MVC5 入门完整教程四---MVC 中使用扩展方法Program.cs 如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace IEnumerableSum
{
class Program
{
static void Main(string[] args)
{ decimal totalPrice;
Book[] books =
{
new Book { Name = "Coho Vineyard", Price = 25.2M },
new Book { Name = "Lucerne Publishing", Price = 18.7M },
new Book { Name = "Wingtip Toys", Price = 6.0M },
new Book { Name = "Adventure Works", Price = 33.8M }
}; ValueCalculator vc = new ValueCalculator();
Shopping sp = new Shopping(vc) { Books = books };
totalPrice = sp.CalculateBookTotal();
Console.WriteLine("The total weight of the packages is: {0}", totalPrice);
Console.ReadKey(); } public decimal ValueBooks(IEnumerable<Book> books)
{
return books.Sum(b => b.Price);
}
}
}
运行结果如下图所示:
其他扩展方法具体实现可参见官方示例点击打开链接