Comment réduire plusieurs blocs foreach nesteds

J’ai le scénario suivant:

var Ids = object1.GetIds(); // returns IEnumerable foreach (var id in Ids) { foreach (var relatedObject in object1.GetRelatedObjects(id)) { // Do Something with related object } } 

Dans ce cas, je veux me débarrasser du premier foreach et réduire cette logique en un seul foreach. Comment pourrais-je y parvenir?

Devrait-il être possible avec LINQ expression une méthodologie similaire?

Lorsqu’il n’y a rien entre les deux boucles, avant ou après la boucle nestede, vous pouvez utiliser SelectMany pour “aplatir” deux boucles en une:

 foreach (var relatedObject in Ids.SelectMany(object1.GetRelatedObjects)) { ... } 

Une différence majeure entre cette boucle et celle que vous avez est que l’ id n’est plus dans la scope. En supposant que relatedObject expose une propriété Id publique, cela ne devrait pas poser de problème dans votre situation, car vous pouvez extraire l’ id avec

 var id = relatedObject.Id; 

Personnellement, j’aime tirer pleinement parti des accolades / blocs en option pour les boucles foreach .

Vous ne pouvez pas réduire la complexité. Mais vous pouvez le rendre plus beau

 IEnumerable Ids = object1.GetIds() foreach (var id in Ids) foreach (var relatedObject in object1.GetRelatedObjects(id)) { DoSomething(relatedObject); }