IEnumerable 与 IEnumerable<T>
转自: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);
}
}
}
运行结果如下图所示:
其他扩展方法具体实现可参见官方示例点击打开链接
IEnumerable 与 IEnumerable<T>的更多相关文章
- IEnumerable和IEnumerable<T>接口
IEnumerable和IEnumerable<T>接口 IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach ...
- 19.C#逐一介绍IEnumerable和IEnumerable<T>中的扩展方法(10.3-10.5)
今天没有太多的言语,只有代码,扩展方法多得太多,不能一一列完,书中一些,看多了也就会使用了. //Enumerable.Range 返回起始到结束范围,是一个Enumrable<int>类 ...
- 先说IEnumerable,我们每天用的foreach你真的懂它吗?
我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...
- 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...
- .NET面试题系列[9] - IEnumerable
.NET面试题系列目录 什么是IEnumerable? IEnumerable及IEnumerable的泛型版本IEnumerable<T>是一个接口,它只含有一个方法GetEnumera ...
- 细说 C# 中的 IEnumerable和IEnumerator接口
我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq to Object中要返回IEnumerable? 接下来,先开始我们的正 ...
- 从yield关键字看IEnumerable和Collection的区别
C#的yield关键字由来以久,如果我没有记错的话,应该是在C# 2.0中被引入的.相信大家此关键字的用法已经了然于胸,很多人也了解yield背后的“延迟赋值”机制.但是即使你知道这个机制,你也很容易 ...
- IEnumerable和IQueryable和Linq的查询
IEnumerable和IEnumerable 1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据 ...
- foreach为什么要实现IEnumerable接口而不是直接用IEnumerator接口
在.Net中,要想被foreach遍历,那么目标对象要实现IEnumerable或IEnumerable<T>接口,这个接口有一个方法,GetEnumerator(),返回一个IEnume ...
随机推荐
- iOS NSArray 的count方法返回的是无符号整形!
){ return cell; } 这样写是错误的!!!当数组为空时,由于count方法返回的是无符号整形,没有负数,self.requests.count -1是一个非常大的正数! 正确写法: &g ...
- awk简单用法-(1)
一.awk基本操作 awk指定多个分割符,分隔符中有:和空格,还有:和空格的组合,这个时候需要指定多个分隔符 -F'[ :]+',[ :]表示分隔符为:和空格,一个或者多个+号表示空格和:的组合也为一 ...
- 29)django-ORM连表结构
连表结构 一对多:models.ForeignKey(其他表) 多对多:models.ManyToManyField(其他表) 一对一:models.OneToOneField(其他表) 应用场景: ...
- sleep()和wait()的区别及wait方法的一点注意事项
一.查看API sleep是Thread类的方法,导致此线程暂停执行指定时间,给其他线程执行机会,但是依然保持着监控状态,过了指定时间会自动恢复,调用sleep方法不会释放锁对象. 当调用sleep方 ...
- Spark Streaming 实现思路与模块概述
一.基于 Spark 做 Spark Streaming 的思路 Spark Streaming 与 Spark Core 的关系可以用下面的经典部件图来表述: 在本节,我们先探讨一下基于 Spark ...
- python并发编程之多进程1-----------互斥锁与进程间的通信
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
- react 中子组件调用父组件的方法
1.在父组件中定义方法,并绑定在子组件上 // 在子组件中调用父组件中的方法 import React,{Component} from 'react'; import Child from './c ...
- cf1140E 回文串+染色方案dp
有点硬核的dp..要用到一个结论.. /* 把原串拆成奇偶串,再拆成极大连续的-1串:该串两端都是非-1数,中间都是-1,并且下标要么都是偶数,要么都是技术 然后对所有这些串进行dp,dp[i][0] ...
- poj1185 状态压缩经典题
状态压缩的好题,直接求会爆内存,先把所有可能的状态求出来存在stk里,然后f[i][k][t]表示i行状态为t,i-1状态为k,由i-1状态来推出i状态即可 注意要打好边际条件的状态,并且某个可行状态 ...
- Tmk吃汤饭
问题 : Tmk吃汤饭 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Tmk喜欢吃汤饭! Tmk喜欢吃汤饭!! Tmk喜欢吃汤饭!!! 汤饭窗口分点餐和取餐两个窗口,一位蜀黍负责点餐窗 ...