2012-11-15 8 views
5

Gibt es ein Standardmuster für die Ausbeute, die alle Elemente in einem Enumerable zurückgibt?Was ist das richtige Muster für die Verarbeitung von Enumerable-Objekten mit einer Ertragsrendite?

öfter als Ich mag finde ich einige meinen Code reflektiert das folgende Muster:

public IEnumerable<object> YieldReturningFunction() 
    { 

     ... 
     [logic and various standard yield return] 
     ... 

     foreach(object obj in methodReturningEnumerable(x,y,z)) 
     { 
      yield return obj; 
     } 

    } 

Die explizite Verwendung einer foreach-Schleife nur die Ergebnisse eines Enumerable stinkt von Codegeruch zu mir zurückzukehren.

Offensichtlich konnte ich die Verwendung von yield return verlassen die Komplexität meines Codes zu erhöhen, indem explizit einen Enumerable Aufbau und Addieren des Ergebnisses jeder Standard Ausbeute Rückkehr zu ihm sowie das Hinzufügen eines den Bereich der Ergebnisse der methodReturningEnumerable . Dies wäre bedauerlich, so dass ich hoffte, dass es einen besseren Weg gibt, das Rendite-Rendite-Muster zu verwalten.

+1

Sie fragen nach 'Ertrag foreach', die nicht existiert. – SLaks

+3

mögliches Duplikat von [Nested yield return with IEnumerable] (http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienerable) – Euphoric

+0

mögliches Duplikat von [Yield Return Many?] (Http: // stackoverflow .com/questions/3851997/yield-return-many) – nawfal

Antwort

5

Nein, daran ist kein Weg vorbei.

Es ist eine Funktion, die angefordert worden ist, und es ist keine schlechte Idee (a yield foreach oder gleichwertig in anderen Sprachen vorhanden).

An diesem Punkt hat Microsoft einfach nicht die Zeit und das Geld zugewiesen, um es zu implementieren. Sie können es in Zukunft umsetzen oder nicht; Ich würde vermuten (ohne sachliche Grundlage), dass es irgendwo auf der To-Do-Liste ist; es ist einfach eine Frage, ob/wann es auf der Liste hoch genug ist, um tatsächlich umgesetzt zu werden.

Die einzig mögliche Änderung, die ich würde sehen konnte, um alle individuellen yield returns von der Spitze des Verfahrens in ihr eigenes enumerable eines Verfahren zum Zurückkehren Refactoring, und dann eine neue Methode hinzu, die die Verkettung dieser Methode gibt und methodReturningEnumerable(x,y,z) . Wäre es besser? Nein wahrscheinlich nicht. Die Concat würde genau so viel hinzufügen, wie Sie sparen würden, wenn nicht mehr.

+1

Ich bezeichne dies als die akzeptierte Antwort, nicht weil es mir die Antwort gibt, nach der ich gesucht habe, sondern weil es gut genug erklärt, warum die Antwort, die ich suche existiert (noch) nicht. – rheone

2

Kann nicht gemacht werden. Es ist aber nicht so schlimm. Sie können es auf eine einzige Zeile verkürzen:

foreach (var o in otherEnumerator) yield return o; 

Unrelated Anmerkung: Sie sollten vorsichtig sein, was Logik, die Sie in Ihren Generatoren umfassen; Die gesamte Ausführung wird zurückgestellt, bis GetEnumerator() für die zurückgegebene IEnumerable aufgerufen wird. Ich erwische mich selbst so oft mit NullArgumentException s, dass ich dachte, es wäre erwähnenswert. :)

Verwandte Themen