Как уменьшить количество вложенных блоков 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);
}
Другие вопросы по тегам