2009-07-22 8 views
0

Voici, le code C#:Une méthode qui renvoie un IEnumerable peut obtenir sa sortie d'une autre méthode avec le même type de retour?

IEnumerable<int> innerMethod(int parameter) 
{ 
    foreach(var i in Enumerable.Range(0, parameter)) 
    { 
     yield return i; 
    } 
} 

IEnumerable<int> outerMethod(int parameter) 
{ 
    foreach(var i in Enumerable.Range(1, parameter)) 
    { 
     foreach(var j in innerMethod(i)) 
     { 
       yield return j; 
     } 
    } 
} 

La question est: Il y a une façon de outerMethod ont la même sortie sans itérer sur la sortie innerMethod?

+0

Il s'agit d'une caractéristique assez fréquemment appelée "yield foreach". Nous ne le supportons pas, mais certaines variantes de "recherche" de C# comme C-Omega le font. Vous devriez lire l'article de Wes à ce sujet: http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about-iterators.aspx –

+0

duplicata possible de [Yield Return Many?] (Http: // stackoverflow.com/questions/3851997/yield-return-many) – nawfal

Répondre

4

Malheureusement pas.

En F #, vous pouvez faire quelque chose comme

yield! innerMethod(i) 

mais il n'y a pas d'équivalent en C#.

Je veux dire, dans ce cas particulier vous pouvez remplacer la méthode avec:

IEnumerable<int> outerMethod(int parameter) 
{ 
    return Enumerable.Range(1, parameter) 
         .SelectMany(x => innerMethod(x)); 
} 

mais je vous attendre voulais une manière plus générale but de le faire. (Si cela vous aide, c'est génial!)

+0

avez-vous édité dans le SelectMany? Je suis sûr que je ne l'ai pas vu quand j'ai répondu ... –

+0

Yup, bien que très vite ... –