2011-04-03 122 views
7

对不起,这个模糊的问题,但我一直在寻找一天的最好的一部分,我已经阅读文章后文章(和许多问题在这里),但找不到一个容易理解的答案。非泛型IEnumerable和泛型IEnumerable <T>有什么区别?

我(我想)知道什么IEnumerable的是对的,但我只是不明白,当它与泛型类型参数定义是什么意思,例如:

IEnumerable<int> test = method(); 

这只是让我狂!请让我摆脱苦难并解释它意味着什么?

回答

13

一种IEnumerable形式使用基本上是对象的集合。它具有方法GetEnumerator(),它允许您遍历枚举中的所有对象。

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

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

这篇文章可能会有所帮助,以及:What's the difference between IEnumerable and Array, IList and List?

+0

之间的微妙差别,我想我现在明白了,我没有意识到它可能是一个集合我只是不明白它是如何工作的。是否有一个很好的资源可以显示,比较IEnumerable/list/arrays的好处/缺陷,因为我真的想了解更多信息。 +1(当我可以!) – idiot 2011-04-03 10:53:28

+0

列表和数组都实现'IEnumerable'。 'System.Collections.Generic'中的所有通用集合实现'IEnumerable '。您可能有兴趣在这篇文章:http://stackoverflow.com/questions/764748/whats-the-difference-between-ienumerable-and-array-ilist-and-list – smartcaveman 2011-04-03 11:00:27

+0

谢谢...并标记为答案.. 。您可能想要在主要答案中编辑/放置该链接,因为这实际上使我现在完全理解了。 – idiot 2011-04-03 11:11:23

2

我只是想到IEnumerable<int>就像我想到的List<int>一样,我认为这会更自然一点。需要提醒的是一个IEnumerable<int>没有做相当多的List<int>,并基本上它只是INTS的事情可以列举

+2

我不太喜欢这个比喻。一个列表假定所有的项目都在一个地方。 “IEnumerable”只是说你可以按顺序获得所有的项目。这就像电话簿和互联网的区别。我可以从任何地方获得芝加哥管道工的所有数字,但在电话簿中,他们已经在列表中,而在IEnumerable或互联网上,他们可以是任何东西,我只需要知道如何找到他们 - 虽然我没有让你失望,但我认为你的答案可以使用更多的清晰度。 – smartcaveman 2011-04-03 03:28:01

+0

user689466正在寻找理解IEnumerable的方法。显然有不同 - 这只是一个容易理解的概念的起点,一旦他唠叨,他可以继续理解两个 – kenwarner 2011-04-05 23:17:05

0

你要找的是“仿制药”这个词,和您给出的示例是将IEnumerable用作int类型项的通用属性。这意味着您正在使用的IEnumerable集合是强类型的,只能保存int对象而不是任何其他类型。

谷歌“C#泛型IEnumerable”,你会发现你想要的所有信息。

0

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

test可以在

foreach(int item : test) 
{ 
    console.writeline(item); 
} 
2

IEnumerableGetEnumerator方法,它会返回一个IEnumerator,其Current方法会返回一个ObjectIEnumerable<T>有一个GetEnumerator方法,该方法将返回一个IEnumerator<T>,其Current方法将返回T。如果事先知道枚举数要返回的对象的预期类型,通常最好使用通用表单。

另一个区别是,IEnumerator<T>继承IDisposable,它允许使用枚举器完成的代码在其上调用Dispose而不必担心它是否受支持。相比之下,如果使用非通用的IEnumerator,则需要测试其是否为IDisposable,并且如果是,则调用Dispose。请注意,使用IEnumerable/IEnumerator的非通用形式并不能解除调用Dispose的要求之一。举例来说,除非发生垃圾收集,否则将vb样式集合转换为IEnumerable,然后在不致电Dispose的情况下调用100,000次将会非常缓慢(甚至在i7上会持续很多秒)。在每次电话会议后处理IEnumerator将会加速超过百倍。

相关问题