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