2008-12-08 7 views
14

Kann jemand ein einfaches Beispiel für die Verwendung des Schlüsselwortes foreach mit benutzerdefinierten Objekten teilen?Wie foreach-Schlüsselwort für benutzerdefinierte Objekte in C verwenden können #

+0

Was genau ist die Frage? Wie verwende ich foreach mit einem benutzerdefinierten Objekt? Oder wie schreibe ich Code in das benutzerdefinierte Objekt, damit foreach darauf verwendet werden kann? –

+1

wie man Code in das benutzerdefinierte Objekt schreibt, so dass foreach darauf verwendet werden kann – user42070

Antwort

37

Angesichts der Tags, ich nehme an, Sie meinen in .NET - und ich werde wählen, über C# zu sprechen, als das ist, was ich weiß.

Die foreach Anweisung (normalerweise) verwendet IEnumerable und IEnumerator oder ihre generischen Verwandten. Eine Anweisung der Form:

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

wo sourceIEnumerable<Foo> implementiert ist grob äquivalent zu:

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

beachte, dass die IEnumerator<Foo> am Ende angeordnet ist, aber die Anweisung beendet. Dies ist wichtig für Iteratorblöcke.

Um IEnumerable<T> oder IEnumerator<T> selbst zu implementieren, ist der einfachste Weg, einen Iteratorblock zu verwenden. Anstatt alle Details hier zu schreiben, ist es wahrscheinlich am besten, Sie nur auf chapter 6 of C# in Depth zu verweisen, was ein kostenloser Download ist. Das ganze Kapitel 6 ist auf Iteratoren. Ich habe noch ein paar Artikel auf meiner C# in Depth-Website, auch:

Als kleines Beispiel wenn:

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 
} 

Zur Umsetzung IEnumerable<T> für eine Geben Sie Folgendes ein:

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 
    } 
} 
+0

Der direkte PDF-Link verweist wieder auf die Bemannungsseite - vielleicht wird das besser funktionieren: http://www.manning.com/skeet/ –

+0

Danke sehr viel - jetzt reparieren. Das ist ein bisschen nervig :( –

6

(gehe ich davon aus C# hier)

Wenn Sie eine Liste der benutzerdefinierten Objekte, die Sie gerade die foreach auf die gleiche Art und Weise verwenden können, wie Sie mit einem anderen Objekt tun:

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

Wenn Sie möchten, Um Ihren eigenen Container zu erstellen, können Sie das Yield-Schlüsselwort (ab .Net 2.0 und höher, glaube ich) zusammen mit der IEnumerable-Schnittstelle verwenden.

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(); 
    } 
} 

Und dann verwenden Sie es mit foreach:

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