【问题标题】:What is the difference between the non-generic IEnumerable and the generic IEnumerable<T>?非泛型 IEnumerable 和泛型 IEnumerable<T> 有什么区别?
【发布时间】:2011-04-03 03:17:42
【问题描述】:

很抱歉这个含糊的问题,但我一直在寻找一天中最好的部分,我已经阅读了一篇又一篇文章(以及这里的许多问题),但找不到一个易于理解的答案。

我(我想我)知道 IEnumerable 是干什么用的,但我就是不明白用泛型类型参数定义它时的含义,例如:

IEnumerable<int> test = method();

这简直把我逼疯了!请让我摆脱痛苦并解释它的含义?

【问题讨论】:

    标签: c# generics syntax ienumerable


    【解决方案1】:

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

    IEnumerable&lt;int&gt; 基本上是整数的集合。它有 GetEnumerator() 方法,它允许您遍历枚举中的所有整数。

    IEnumerable&lt;int&gt; test = method(); 表示method() 正在从某个地方获取整数。它可以是一个列表、一个数组或其他一些数据类型,但它绝对是它们的一组,它们都是整数,你可以遍历它们。

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

    【讨论】:

    • 好吧,我想我现在明白了,我没有意识到它可能是一个集合,我只是不明白它是如何工作的。是否有一个很好的资源可以显示比较 IEnumerable/list/arrays 的好处/缺陷,因为我真的想了解更多。 +1(当我可以的时候!)
    • 列表和数组都实现了IEnumerableSystem.Collections.Generic 中的所有泛型集合都实现了IEnumerable&lt;T&gt;。你可能对这篇文章感兴趣:stackoverflow.com/questions/764748/…
    • 谢谢...并标记为答案...您可能还想编辑/将该链接放入您的主要答案中,因为这真的让我现在完全理解了。
    【解决方案2】:

    我只是想到IEnumerable&lt;int&gt; 就像我想到List&lt;int&gt; 一样,我想这更自然一点。需要注意的是,IEnumerable&lt;int&gt; 的作用不如 List&lt;int&gt;,本质上它只是 事物 可以枚举的整数

    【讨论】:

    • 我不太喜欢这个类比。列表假定所有项目都在一个地方。 IEnumerable 只是说您可以按顺序获取所有项目。这就像电话簿和互联网之间的区别。我可以从任何一个地方获得芝加哥水管工的所有电话号码,但在电话簿中,它们已经在列表中 - 而在IEnumerable 或互联网上,它们可以是任何东西,我只需要知道如何找到他们——不过我并没有对你投反对票,我只是认为你的答案可以更清楚一点。
    • user689466 正在寻找一种理解 IEnumerable 的方法。显然存在差异 - 这只是一个易于理解的概念的起点,一旦他摸索到,他就可以继续理解两者之间的微妙之处
    【解决方案3】:

    您要查找的词是“泛型”,您给出的示例是 IEnumerable 被用作 int 类型项目的泛型。这意味着您使用的 IEnumerable 集合是强类型的,仅保存 int 对象,而不是任何其他类型。

    谷歌“C# generics IEnumerable”,你会找到所有你想要的信息。

    【讨论】:

      【解决方案4】:

      IEnumerable 有一个GetEnumerator 方法,该方法将返回一个IEnumerator,其Current 方法将返回一个ObjectIEnumerable&lt;T&gt; 有一个 GetEnumerator 方法,该方法将返回一个 IEnumerator&lt;T&gt;,其 Current 方法将返回一个 T。如果您事先知道枚举器要返回的对象的预期类型,通常最好使用泛型形式。

      另一个区别是IEnumerator&lt;T&gt;继承IDisposable,它允许使用枚举器完成的代码调用Dispose,而不必担心它是否受支持。相比之下,当使用非泛型IEnumerator 时,需要测试它是否为IDisposable,如果是则调用Dispose。请注意,使用IEnumerable/IEnumerator 的非通用形式并不能减轻调用Dispose 的要求之一。例如,将 vb 样式的 Collection 转换为 IEnumerable,然后在不调用 Dispose 的情况下调用 GetEnumerator 100,000 次将非常慢(很多秒,即使在 i7 上也是如此),除非碰巧发生垃圾回收。在每次通话后处理 IEnumerator 将使处理速度提高一百倍以上。

      【讨论】:

        【解决方案5】:

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

        items的形式可以使用

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-05
          • 2014-07-22
          • 1970-01-01
          相关资源
          最近更新 更多