【问题标题】:C# IEnumerable implementationC# IEnumerable 实现
【发布时间】:2017-03-14 09:08:51
【问题描述】:

我不认为我理解IEnumerable 并且已经进行了几次谷歌搜索。

我应该为一些对象创建一个容器,其中 Container 类应该处理容器所代表的集合的更新(添加、删除)。

集合Container 应该是IEnumerable<element> 的实例。

namespace ....
{
    public class Container : Ienumerable<Elements>
    { 
        List<Elements> _elm = new List<Elements>();
        List<Elements> _add = new List<Elements>();
        List<Elements> _rem = new List<Elements>();

        public voic PendAdd(Element elm)
        {
            _add.Add(elm);
        }

        public voic Pendrem(Element elm)
        {
            _rem.remove(elm);
        }

         ...

        public IEnumerator<Element> GetEnumerator()
        {
            return _elm.GetEnumerator();
        }

    }
}

我的问题是IEnumerable&lt;Elements&gt; 是一个抽象类型,如果我将_elm 设为这种类型,即使我做到了,我也无法处理Container 的状态

IEnumerable<Element> _elm = new List<Element> ();

VS 报错:

'Container' 没有实现接口成员 'IEnumerable.GetEnumerator()'。 'Container.GetEnumerator()' 不能 实现 'IEnumerable.GetEnumerator()' 因为它没有 'IEnumerator' 的匹配返回。

我知道有几个关于 IEnumerable 的答案,但它们对我没有帮助。

【问题讨论】:

  • ElementElements 有什么区别?您继承了IEnumerable&lt;Elements&gt;,但将GetEnumerator 的返回类型声明为IEnumerator&lt;Element&gt;,并且您缺少非泛型IEnumerator GetEnumerator() 方法。
  • 如果您在 Visual Studio 中使用“实现接口”快捷方式,它将创建您需要实现的方法。根据 xanatos 的回答,这包括缺少的 GetEnumerator 方法及其正确的返回类型。
  • 为什么要从 IEnumerable 继承?为什么你有三个不同的列表?您可以只在 IEnumerable(例如 List)周围有一个包装类,并拥有从该列表中添加/删除的方法。
  • 在 google 上搜索 does not implement interface member 'IEnumerable.GetEnumerator()'. 会立即出现几篇 SO 帖子,其中之一是 ► Troubles implementing IEnumerable<T>
  • 感谢所有 cmets 元素/元素是一个错字。对不起,如果我的问题不是那么清楚,我是 OO 和 C# 的新手。我的专长主要是函数式编程,如 SML、F# 和 Ocaml。并且可以说我和一个试图学习函数式编程的 OO 人有同样的情绪。我只是对它感兴趣.. 我得到了一些跟进,但我在答案部分记下了它们

标签: c# ienumerable


【解决方案1】:

您缺少IEnumerable.GetEnumerator()IEnumerable&lt;T&gt; 继承自IEnumerable。因此,在您的班级中,您需要两个不同的 GetEnumerator() 并具有两种不同的返回类型。

public class Container : IEnumerable<Element>
{
    List<Element> _elm = new List<Element>();
    List<Element> _add = new List<Element>();
    List<Element> _rem = new List<Element>();

    public void PendAdd(Element elm)
    {
        _add.Add(elm);
    }

    public void Pendrem(Element elm)
    {
        _rem.Remove(elm);
    }

    public IEnumerator<Element> GetEnumerator()
    {
        return _elm.GetEnumerator();
    }

    // This is called "explicit interface implementation", see
    // https://msdn.microsoft.com/en-us/library/ms173157.aspx
    IEnumerator IEnumerable.GetEnumerator()
    {
        // will call the "other" GetEnumerator()
        return GetEnumerator();
    }
}

下次你要实现接口的时候,建议你在Visual Studio中右击接口,选择Implement Interface,得到你需要的所有方法的骨架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多