非常抱歉这个问题比较模糊,但我已经搜索了一整天,阅读了很多文章(包括很多这里的问题),但是仍然找不到一个易于理解的答案。
我认为我知道IEnumerable是用来做什么的,但当它与泛型类型参数一起定义时,我就无法理解它的含义,例如:
IEnumerable<int> test = method();
这简直让我疯掉了!请告诉我它的意思,以解除我的痛苦?
非常抱歉这个问题比较模糊,但我已经搜索了一整天,阅读了很多文章(包括很多这里的问题),但是仍然找不到一个易于理解的答案。
我认为我知道IEnumerable是用来做什么的,但当它与泛型类型参数一起定义时,我就无法理解它的含义,例如:
IEnumerable<int> test = method();
这简直让我疯掉了!请告诉我它的意思,以解除我的痛苦?
IEnumerable
是一组对象的集合,它有一个GetEnumerator()
方法,允许您遍历枚举中的所有对象。
IEnumerable<int>
是一组整数的集合,它有一个GetEnumerator()
方法,允许您遍历枚举中的所有整数。
IEnumerable<int> test = method();
表示method()
从某个地方获取了一组整数,可以是List, 数组或其他数据类型,但它们绝对都是整数,并且您可以遍历它们。
这篇文章也许会有所帮助:IEnumerable和Array、IList和List之间的区别是什么?
我认为IEnumerable<int>
和List<int>
差不多,只是前者更自然一些。需要注意的是,IEnumerable<int>
并不能像List<int>
那样有很多功能,它本质上只是一个可以枚举的整数序列
IEnumerable
仅表示您可以按某些顺序获取所有项目。这就像电话簿和互联网之间的区别。我可以从任何一个地方获取芝加哥水管工的所有号码,但在电话簿中,它们已经在列表中了,而在IEnumerable
或互联网上,它们可以是任何东西,我只需要知道如何找到它们-虽然我没有踩你的回答,但我认为它需要更多的清晰度。 - smartcavemanIEnumerable
有一个 GetEnumerator
方法,它将返回一个 IEnumerator
,其 Current
方法将返回一个 Object
。一个 IEnumerable<T>
有一个 GetEnumerator
方法,它将返回一个 IEnumerator<T>
,其 Current
方法将返回一个 T
。如果您提前知道枚举器返回对象的预期类型,则通常最好使用通用形式。IEnumerator<T>
继承了 IDisposable
,这允许代码在完成对枚举器的使用后调用 Dispose
而无需担心是否支持。相比之下,当使用非泛型的 IEnumerator
时,需要测试它是否为 IDisposable
并在需要时调用 Dispose
。请注意,使用非泛型的 IEnumerable
/IEnumerator
不会免除调用 Dispose
的要求。例如,将 vb 样式的 Collection 强制转换为 IEnumerable
,然后调用 GetEnumerator
100,000 次而不调用 Dispose
将非常缓慢(即使在 i7 上也需要几秒钟),除非恰好发生垃圾回收。每次调用后处理 IEnumerator
将使速度提高百倍以上。IEnumerable 表示它可以在 foreach 循环中使用。
items
可以以以下形式使用
foreach(var item in items)
{
Console.WriteLine(item);
}
IEnumerable
接口。System.Collections.Generic
中的所有泛型集合都实现了IEnumerable<T>
接口。您可能会对这篇文章感兴趣:https://dev59.com/YnRA5IYBdhLWcg3w9y10。 - smartcaveman