C# 中有Enumerable和 IEnumerable以及 IEnumerable<TSource>
Enumerable:意为可枚举的
这三个常常让人搞混,简单来说
Enumerable:
位于System.Core程序集,System.Linq下,是一个静态类,里面包含了很多linq的扩展方法
他只是一个类而已,跟IEnumerable没什么关系,只是包含了一堆扩展方法。
关注的重点应该是IEnumerable

IEnumerable:
位于mscorlib程序集,System.Collections下,是一个接口,只有一个方法GetEnumerator()

IEnumerable<TSource>:
位于mscorlib程序集,System.Collections.Generic下,是一个带泛型的接口,只有一个方法GetEnumerator(),而且也继承了IEnumerable接口

如何转化:
很明显Enumerable是无法和IEnumerable还有IEnumerable<TSource>相互转换的
但是IEnumerable还有IEnumerable<TSource>是可以的,由于IEnumerable<TSource>继承IEnumerable,所以前者转后者没有必要也毫无意义
所以我们主要讨论的是后者转化成前者
我们常用的集合如List,是已经继承了IEnumerable<TSource>,所以可以使用所以Linq的扩展方法,如select,where等
但是比如DataTable.Rows,这只继承了IEnumerable,若想对其进行linq操作,首先必须得将其转化成IEnumerable<TSource>
如何转化,代码:

可以通过Cast<>来转,因为Cast<>方法是IEnumerable的扩展方法,而datatable.Rows是间接继承了IEnumerable,所以可以调用Cast

总结:
在.NET中使用linq,必须想办法将集合转化成IEnumerable<TSource>
幸运的是大多数集合都继承者IEnumerable和IEnumerable<TSource>
即便是ICollection,没错,ICollection也是继承IEnumerable,那么也可以通过Cast转化,如图:

也就是说,.NET中绝大多数的集合都可以使用Linq
本文介绍了C#中的Enumerable、IEnumerable和IEnumerable<TSource>。Enumerable是静态类,含Linq扩展方法;IEnumerable和IEnumerable<TSource>是接口。还说明了它们之间的转换,指出在.NET中使用Linq需将集合转化为IEnumerable<TSource>,多数集合可实现。

1908

被折叠的 条评论
为什么被折叠?



