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 ...
- HomeBrew 安转beta版软件
今天想装测试版的cocoapods,用 brew install cocoapods 后,总是安装稳定版,就是1.1.0,不是最新的beta版,发现用下面这个命令可以装最新beta版 brew ins ...
- 洛谷P3676 小清新数据结构题 [动态点分治]
传送门 思路 这思路好妙啊! 首先很多人都会想到推式子之后树链剖分+线段树,但这样不够优美,不喜欢. 脑洞大开想到这样一个式子: \[ \sum_{x} sum_x(All-sum_x) \] 其中\ ...
- TCP和UDP的对比
UDP #面向报文 UDP 是一个面向报文(报文可以理解为一段段的数据)的协议.意思就是 UDP 只是报文的搬运工,不会对报文进行任何拆分和拼接操作. 具体来说 在发送端,应用层将数据传递给传输层的 ...
- Confluence 6 导入模板的定义
模板是一个预先定义的页面,这个预先定义的页面可以在创建新页面的时候预先载入.模板能够给一个页面统一的样式或格式. 你可以在 Confluence 中创建你自己的模板,请查看页面 Create a Te ...
- ios消息机制
ios消息机制介绍 ios 调用每一个方法的时候其实是走的ios的消息机制 举例介绍一下 创建一个Pserson类 有一个eat 对象方法 那么下面的代码可以用消息机制实现 导入消息头文件 # ...
- NIO(四)
使用非直接缓冲区和直接缓冲区复制同一个文件,看一下时间差别 1.创建非直接缓冲区测试类 package com.cppdy.nio; import java.io.FileInputStream; i ...
- extjs中store的reload事件异步问题解决
转载自:http://blog.sina.com.cn/s/blog_8f8b7fc10100zd75.html store0.reload({params:{start:0, limit:10}}) ...
- 【python】json中字典key不可为数值型
遇到了一个很诡异的错误.写一个字典,存入json文件.之后读出判断是否存在key.结果惊奇的发现,同一个key居然存在两次. 原因:json会将数值key转换为unicode 结论:使用json时字典 ...
- 制作linux下的.run安装包
前言 之前往linux上安装一个软件,都是以压缩包或者压缩包+shell的方法,这每次安装,都是先scp到某个目录, 解压,安装......稍微厉害的,会写个shell脚本.但是还是达不到真正的快速方 ...