我知道如何实现非通用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>,但我不知道如何实现它。
IEnumerable<T>
如果添加using System.Collections.Generic;到我的using指令,然后更改:
using System.Collections.Generic;
class MyObjects : IEnumerable
至:
class MyObjects : IEnumerable<MyObject>
然后右键单击IEnumerable<MyObject>并选择Implement Interface => Implement Interface,Visual Studio会帮助添加以下代码块:
IEnumerable<MyObject>
Implement Interface => Implement Interface
IEnumerator<MyObject> IEnumerable<MyObject>.GetEnumerator() { throw new NotImplementedException(); }
这次从该GetEnumerator();方法返回非通用IEnumerable对象不起作用,那么我在这里放什么呢?现在,CLI会忽略非通用实现,并在foreach循环中尝试枚举数组时直接进入通用版本。
GetEnumerator();
如果您选择使用通用集合(例如List<MyObject>而不是)ArrayList,则会发现List<MyObject>会同时提供您可以使用的通用和非通用枚举器。
List<MyObject>
ArrayList
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(); } }