如何在C#中的自定义对象上使用foreach关键字

有人可以分享一个将foreach关键字与自定义对象一起使用的简单示例吗?

鉴于标签,我认为你的意思是在.NET中 – 我会选择谈论C#,因为这就是我所知道的。

foreach语句(通常)使用IEnumerableIEnumerator或它们的通用表兄弟。 表格声明:

 foreach (Foo element in source) { // Body } 

其中source实现的IEnumerable 大致相当于:

 using (IEnumerator iterator = source.GetEnumerator()) { Foo element; while (iterator.MoveNext()) { element = iterator.Current; // Body } } 

请注意, IEnumerator在最后处置,但语句退出。 这对于迭代器块很重要。

要自己实现IEnumerableIEnumerator ,最简单的方法是使用迭代器块。 而不是在这里写下所有细节,最好只是引用你到深度C#的第6章 ,这是一个免费下载。 整个第6章是关于迭代器的。 我在深度网站上的C#上还有另外两篇文章:

  • 迭代器,迭代器块和数据管道
  • 迭代器块实现细节

作为一个简单的例子:

 public IEnumerable EvenNumbers0To10() { for (int i=0; i <= 10; i += 2) { yield return i; } } // Later foreach (int x in EvenNumbers0To10()) { Console.WriteLine(x); // 0, 2, 4, 6, 8, 10 } 

要为类型实现IEnumerable ,您可以执行以下操作:

 public class Foo implements IEnumerable { public IEnumerator GetEnumerator() { yield return "x"; yield return "y"; } // Explicit interface implementation for nongeneric interface IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); // Just return the generic version } } 

(我在这里假设C#)

如果您有自定义对象列表,则可以像使用任何其他对象一样使用foreach:

 List myObjects = // something foreach(MyObject myObject in myObjects) { // Do something nifty here } 

如果你想创建自己的容器,你可以使用yield关键字(从.Net 2.0及以上我相信)和IEnumerable接口。

 class MyContainer : IEnumerable { private int max = 0; public MyContainer(int max) { this.max = max; } public IEnumerator GetEnumerator() { for(int i = 0; i < max; ++i) yield return i; } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } 

然后将它与foreach一起使用:

 MyContainer myContainer = new MyContainer(10); foreach(int i in myContainer) Console.WriteLine(i);