一尘不染

我如何实现IEnumerable

c#

我知道如何实现非通用IEnumerable,如下所示:

using System;
using System.Collections;

namespace ConsoleApplication33
{
    class Program
    {
        static void Main(string[] args)
        {
            MyObjects myObjects = new MyObjects();
            myObjects[0] = new MyObject() { Foo = "Hello", Bar = 1 };
            myObjects[1] = new MyObject() { Foo = "World", Bar = 2 };

            foreach (MyObject x in myObjects)
            {
                Console.WriteLine(x.Foo);
                Console.WriteLine(x.Bar);
            }

            Console.ReadLine();
        }
    }

    class MyObject
    {
        public string Foo { get; set; }
        public int Bar { get; set; }
    }

    class MyObjects : IEnumerable
    {
        ArrayList mylist = new ArrayList();

        public MyObject this[int index]
        {
            get { return (MyObject)mylist[index]; }
            set { mylist.Insert(index, value); }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return mylist.GetEnumerator();
        }
    }
}

但是我还注意到IEnumerable具有通用版本IEnumerable<T>,但我不知道如何实现它。

如果添加using System.Collections.Generic;到我的using指令,然后更改:

class MyObjects : IEnumerable

至:

class MyObjects : IEnumerable<MyObject>

然后右键单击IEnumerable<MyObject>并选择Implement Interface => Implement Interface,Visual Studio会帮助添加以下代码块:

IEnumerator<MyObject> IEnumerable<MyObject>.GetEnumerator()
{
    throw new NotImplementedException();
}

这次从该GetEnumerator();方法返回非通用IEnumerable对象不起作用,那么我在这里放什么呢?现在,CLI会忽略非通用实现,并在foreach循环中尝试枚举数组时直接进入通用版本。


阅读 276

收藏
2020-05-19

共1个答案

一尘不染

如果您选择使用通用集合(例如List<MyObject>而不是)ArrayList,则会发现List<MyObject>会同时提供您可以使用的通用和非通用枚举器。

using System.Collections;

class MyObjects : IEnumerable<MyObject>
{
    List<MyObject> mylist = new List<MyObject>();

    public MyObject this[int index]  
    {  
        get { return mylist[index]; }  
        set { mylist.Insert(index, value); }  
    }

    public IEnumerator<MyObject> GetEnumerator()
    {
        return mylist.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}
2020-05-19