答:实现IEnumerable或其IEnumerable<T>。该接口只有一个函数 public IEnumerator GetEnumerator();
在这里,IEnumerator也是一个接口,我们将实现该接口的类称之为枚举数(enumerator)。
也就是说,任何一个可以被枚举的类型,都可以通过GetEnumerator()得到这个枚举数;反过来,任何一个类型,若想要其能被枚举,那么必须实现IEnumerator接口的GetEnumerator()方法。
那么,如何实现GetEnumerator?
下面是三个版本的例子
例子1:非泛型
class Program { static void Main(string[] args) { MyColors myColors=new MyColors(); foreach (var myColor in myColors) { Console.WriteLine(myColor); } Console.Read(); } } class ColorEnumerator : IEnumerator { private string[] Colors; int position = -1; public bool MoveNext() { position++; if (position<Colors.Count()) { return true; } return false; } public void Reset() { position = -1; } public object Current { get { return Colors[position]; } } public ColorEnumerator(string[] theColors) { Colors = new string[theColors.Count()]; for (int i = 0; i < theColors.Count(); i++) { Colors[i] = theColors[i]; } } } class MyColors : IEnumerable { private string[] Colors = {"Red","Yellow","Blue"}; public IEnumerator GetEnumerator() { return new ColorEnumerator(Colors); } }
例子二(泛型的方法):
class ColorEnumerator : IEnumerator<string> { private string[] Colors; int position = -1; public bool MoveNext() { position++; if (position<Colors.Count()) { return true; } return false; } public void Reset() { position = -1; } object IEnumerator.Current { get { return Current; } } public string Current { get { return Colors[position]; } } public ColorEnumerator(string[] theColors) { Colors = new string[theColors.Count()]; for (int i = 0; i < theColors.Count(); i++) { Colors[i] = theColors[i]; } } public void Dispose() { } }
class MyColors : IEnumerable<string> { private string[] Colors = { "Red", "Yellow", "Blue" }; public IEnumerator<string> GetEnumerator() { return new ColorEnumerator(Colors); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } class Program { static void Main(string[] args) { MyColors myColors = new MyColors(); foreach (var color in myColors) { Console.WriteLine(color); } Console.Read(); } }
例子三(迭代器方法):
class MyColors : IEnumerable { public IEnumerator GetEnumerator() { yield return "Blue"; yield return "Yellow"; yield return "Red"; } }