Как уменьшить количество вложенных блоков foreach
У меня есть следующий сценарий:
var Ids = object1.GetIds(); // returns IEnumerable<int>
foreach (var id in Ids)
{
foreach (var relatedObject in object1.GetRelatedObjects(id))
{
// Do Something with related object
}
}
В этом случае я хочу избавиться от первого foreach и свести эту логику к одному foreach. Как я мог достичь этого?
Должно ли это быть возможно с выражением LINQ какой-то подобной методологии?
2 ответа
Если между двумя циклами, до или после вложенного, ничего нет, вы можете использовать SelectMany
"сплющить" две петли в одну:
foreach (var relatedObject in Ids.SelectMany(object1.GetRelatedObjects)) {
...
}
Одно из основных различий между этим циклом и тем, что у вас есть, заключается в том, что id
больше не в сфере. При условии, что relatedObject
выставляет публику Id
собственность, это не должно быть проблемой в вашей ситуации, потому что вы можете извлечь id
вернуться с
var id = relatedObject.Id;
Лично мне нравится в полной мере использовать дополнительные брекеты / блок для foreach
петли.
Вы не можете уменьшить сложность. Но вы можете заставить его выглядеть лучше
IEnumerable<int> Ids = object1.GetIds()
foreach (var id in Ids)
foreach (var relatedObject in object1.GetRelatedObjects(id))
{
DoSomething(relatedObject);
}