如何减少多个嵌套的foreach块

我有以下情况:

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

在这种情况下,我想摆脱第一个foreach并将这个逻辑减少为单个foreach。 我怎么能做到这一点?

LINQ表达式是否可以使用类似的方法?

当两个循环之间没有任何内容时,在嵌套的循环之前或之后,您可以使用SelectMany将两个循环“展平”为一个循环:

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

这个循环和循环之间的一个主要区别是id不再在范围内。 假设relatedObject公开了一个公共Id属性,这在你的情况下应该不是问题,因为你可以用

 var id = relatedObject.Id; 

我个人喜欢充分利用foreach循环的可选支撑/块。

你无法降低复杂性。 但你可以让它看起来更好

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