C#IEnumerable实现

时间:2017-03-14 09:08:51

标签: c# ienumerable

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

我应该创建一些Container的对象,其中类Container应该处理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<Elements>是一种抽象类型,如果我使_elm这种类型,即使我做了它,我也无法处理Container的状态

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

VS抱怨错误:

  

&#39;集装箱&#39;没有实现接口成员   &#39; IEnumerable.GetEnumerator()&#39 ;. &#39; Container.GetEnumerator()&#39;不能   实现&#39; IEnumerable.GetEnumerator()&#39;因为它没有   匹配返回&#39; IEnumerator&#39;。

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

1 个答案:

答案 0 :(得分:3)

您遗漏了从IEnumerable.GetEnumerator()继承的IEnumerable<T>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来获取你需要的所有方法的骨架。