为集合类实现 IEnumerable?

Posted

技术标签:

【中文标题】为集合类实现 IEnumerable?【英文标题】:Implement IEnumerable for a collection class? 【发布时间】:2013-11-12 05:42:19 【问题描述】:

我想了解这个主题,而不仅仅是能够放弃语法。我有一个名为 IGroupNode 的集合类,它最多可以容纳 8 个子 ISceneNode。

internal class GroupNode : IGroupNode

    public string Name
    
        get;
        private set;
    

    const int NumberOfChildren = 8;
    #region Member variables
    private IList<ISceneNode> children = new List<ISceneNode>(NumberOfChildren);
    #endregion

    public IEnumerable<ISceneNode> GetEnumerator()
    
        //?
    

您可能会说,它是一个非常简单的基于列表的集合类。我怎样才能在这里实现 IEnumerable 只需返回 内部容器的枚举器?在这种非常简单的情况下,我不确定如何做到这一点。

现在我遇到了这个问题:

'Weber.SceneGraphCore.GroupNode' does not implement interface member 'System.Collections.IEnumerable.GetEnumerator()'. 'Weber.SceneGraphCore.GroupNode.GetEnumerator()' cannot implement 'System.Collections.IEnumerable.GetEnumerator()' because it does not have the matching return type of 'System.Collections.IEnumerator'.

【问题讨论】:

【参考方案1】:

在这种情况下,您可以简单地返回 children.GetEnumerator()。 (顺便说一下,您的 GroupNode 对象应该实现 IEnumerable 并且您的 GetEnumerator 方法应该具有正确的返回类型。)

public IEnumerator<ISceneNode> GetEnumerator()

    return children.GetEnumerator()

在更一般的情况下,尽管您可以迭代某些内容并为每个元素调用 yield return

【讨论】:

不能将 IEnumerable 隐式定义为 IEnumerator 你把GetEnumerator的返回类型改成IEnumerator了吗? 不,但那是如何工作的。那么,类实现了IEnumerable,但在实际实现中,我实现了IEnumerator?为什么这行得通.. 你是对的,我只是希望 IEnumerable 现在可以完全实现。我将尝试继续,看看我是否遇到任何问题(感谢智能感知) "在实际实现中我实现了 IEnumerator" 这不准确。阅读接口 IEnumerable 的文档。注意方法的返回类型。当然接口 A 可以有一个返回 B 类型对象的方法。【参考方案2】:

由于 IList 已经实现了 IEnumerable&lt;&gt;,因此您可以在您的 GetEnumerator() 方法中返回 children.GetEnumerator()

【讨论】:

以上是关于为集合类实现 IEnumerable?的主要内容,如果未能解决你的问题,请参考以下文章

IEnumable和yield

数组为什么可以使用linq查询

InvalidCastException:无法将“System.Collections.Generic.List”类型的对象转换为 System.Collections.Generic.IEnumer

C#定义一个泛型集合类。要求:实现Ienumerable<T>接口,T是值类型,并T取2个类型分别测试。

无法使用集合初始化程序初始化类型“”,因为它没有实现“System.Collections.IEnumerable”

C#中List(Of T)类