2008-12-08 53 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); 
相關問題