2008-12-08 49 views
14

有人可以分享一个简单的例子,使用foreach关键字与自定义对象?如何使用foreach关键字自定义对象在C#

+0

具体是什么问题?如何*使用foreach与自定义对象?或者如何在自定义对象中编写代码,以便可以使用foreach? – 2008-12-08 09:13:49

+1

如何在自定义对象中编写代码,以便可以使用foreach – user42070 2008-12-08 09:15:52

回答

37

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

foreach声明(通常)使用IEnumerableIEnumerator或它们的通用表亲。形式的语句:

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

其中source实现IEnumerable<Foo>大致等效于:

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

注意,IEnumerator<Foo>设置在端,但是该语句退出。这对迭代器块很重要。

要自己实现IEnumerable<T>IEnumerator<T>,最简单的方法是使用迭代器块。不要在这里写下所有的细节,最好的方法是直接引用chapter 6 of C# in Depth,这是免费下载。整个第6章是关于迭代器的。我有另一对夫妇的文章对我的C#在深入现场,太:

作为一个简单的例子,但:

public IEnumerable<int> 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<T>为类型,你可以这样做:

public class Foo implements IEnumerable<string> 
{ 
    public IEnumerator<string> GetEnumerator() 
    { 
     yield return "x"; 
     yield return "y"; 
    } 

    // Explicit interface implementation for nongeneric interface 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); // Just return the generic version 
    } 
} 
6

(我假设这里C#)

如果有自定义对象的列表,你可以只使用foreach以同样的方式为你做任何其他对象:

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

如果你想要创建自己的容器,您可以使用yield关键字(来自.Net 2.0及更高版本)和IEnumerable接口一起使用。

class MyContainer : IEnumerable<int> 
{ 
    private int max = 0; 
    public MyContainer(int max) 
    { 
     this.max = max; 
    } 

    public IEnumerator<int> 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); 
相关问题