非泛型的IEnumerable和泛型的IEnumerable<T>有什么区别?

10

非常抱歉这个问题比较模糊,但我已经搜索了一整天,阅读了很多文章(包括很多这里的问题),但是仍然找不到一个易于理解的答案。

我认为我知道IEnumerable是用来做什么的,但当它与泛型类型参数一起定义时,我就无法理解它的含义,例如:

IEnumerable<int> test = method();

这简直让我疯掉了!请告诉我它的意思,以解除我的痛苦?

5个回答

13

IEnumerable是一组对象的集合,它有一个GetEnumerator()方法,允许您遍历枚举中的所有对象。

IEnumerable<int>是一组整数的集合,它有一个GetEnumerator()方法,允许您遍历枚举中的所有整数。

IEnumerable<int> test = method();表示method()从某个地方获取了一组整数,可以是List, 数组或其他数据类型,但它们绝对都是整数,并且您可以遍历它们。

这篇文章也许会有所帮助:IEnumerable和Array、IList和List之间的区别是什么?


好的,我现在明白了,我没有意识到它可以是一个集合,而且我也不理解它的工作原理。你能否推荐一些好的资源,展示比较IEnumerable/list/arrays的优缺点,因为我真的想学习更多。+1(等我可以!) - idiot
列表和数组都实现了 IEnumerable 接口。System.Collections.Generic 中的所有泛型集合都实现了 IEnumerable<T> 接口。您可能会对这篇文章感兴趣:https://dev59.com/YnRA5IYBdhLWcg3w9y10。 - smartcaveman
谢谢...并标记为答案...你可能想要编辑/将那个链接放在你的主要答案中,因为那真的让我完全理解了。 - idiot

2

我认为IEnumerable<int>List<int>差不多,只是前者更自然一些。需要注意的是,IEnumerable<int>并不能像List<int>那样有很多功能,它本质上只是一个可以枚举的整数序列


4
我不是很喜欢这个比喻。列表假设所有项目都在一个地方,而IEnumerable仅表示您可以按某些顺序获取所有项目。这就像电话簿和互联网之间的区别。我可以从任何一个地方获取芝加哥水管工的所有号码,但在电话簿中,它们已经在列表中了,而在IEnumerable或互联网上,它们可以是任何东西,我只需要知道如何找到它们-虽然我没有踩你的回答,但我认为它需要更多的清晰度。 - smartcaveman
user689466正在寻找了解IEnumerable的方法。显然存在差异 - 这只是一个易于理解的概念起点,一旦他掌握了这个概念,就可以继续理解两者之间的微妙差别。 - kenwarner

2
您要找的词是“泛型”,您提供的示例是IEnumerable被用作int类型的通用类型。这意味着您正在使用的IEnumerable集合是强类型的,只能容纳int对象,而不是任何其他类型。
请谷歌搜索“C#泛型IEnumerable”,您将找到有关此信息的所有信息。

2
一个 IEnumerable 有一个 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 将使速度提高百倍以上。

-1

IEnumerable 表示它可以在 foreach 循环中使用。

items 可以以以下形式使用

foreach(var item in items)
{
   Console.WriteLine(item);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接