2012-11-15 18 views
5

Esiste uno schema standard per la resa che restituisce tutti gli articoli all'interno di una enumerabile?Qual è il modello corretto per la gestione di oggetti enumerabili con un rendimento restituito?

Più spesso di quanto Mi piace trovare un po 'del mio codice che riflette il seguente schema:

public IEnumerable<object> YieldReturningFunction() 
    { 

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

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

    } 

L'uso esplicito di un ciclo foreach esclusivamente per restituire i risultati di un enumerabili puzza di odore di codice a me.

Ovviamente ho potuto abbandonare l'uso di ritorno resa aumentare la complessità del mio codice costruendo esplicitamente un Enumerable e aggiungendo il risultato di ogni ritorno resa standard per esso così come l'aggiunta di una gamma di risultati della methodReturningEnumerable . Ciò sarebbe sfortunato, in quanto tale speravo che esista un modo migliore per gestire il modello di rendimento.

+1

Stai chiedendo "rendimento foreach', che non esiste. – SLaks

+3

possibile duplicato di [Rendimento rendimento nidificato con IEnumerable] (http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable) – Euphoric

+0

possibile duplicato di [Yield Return Many?] (Http: // stackoverflow .com/questions/3851997/yield-return-many) – nawfal

risposta

5

No, non c'è modo di aggirare questo.

È una funzione richiesta e non è una cattiva idea (uno yield foreach o equivalente esiste in altre lingue).

A questo punto Microsoft non ha semplicemente assegnato tempo e denaro per implementarlo. Potrebbero o meno implementarlo in futuro; Direi (senza basi fattuali) che è da qualche parte nella lista delle cose da fare; è semplicemente una questione di se/quando diventa abbastanza alto in quella lista per essere effettivamente implementato.

L'unica possibile cambiamento che ho potuto vedere sarebbe quello di refactoring tutte dell'individuo yield returns dalla parte superiore del metodo in un proprio metodo di ritorno enumerabile, e quindi aggiungere un nuovo metodo che restituisce la concatenazione di quel metodo e methodReturningEnumerable(x,y,z) . Sarebbe meglio no, probabilmente no. Lo Concat si aggiungerebbe di nuovo nel momento in cui avresti salvato, se non di più.

+1

Segnalo come risposta accettata non perché mi dà la risposta che stavo cercando ma perché spiega abbastanza bene perché la risposta che sto cercando non esiste (ancora). – rheone

2

Impossibile eseguire. Non è poi così male. Si può ridurre a una sola riga:

foreach (var o in otherEnumerator) yield return o; 

nota indipendenti: si dovrebbe essere attenti a quello che la logica di includere nei vostri gruppi elettrogeni; tutta l'esecuzione è rinviata fino a quandoviene richiamato sul numero IEnumerable restituito. Mi sorprendo a lanciare in modo errato NullArgumentException s così spesso che ho pensato che fosse degno di nota. :)