Более компактный способ "возврата прибыли"?

У меня есть этот метод, который дает значения, полученные 2 методами:

private IEnumerable<Node> ParseEmptyElement()
{
    foreach (var node in ParseMembersOfObject()) 
    {
        yield return node;
    }

    foreach (var node in ParseNestedProperty()) 
    {
        yield return node;
    }
}

Это кажется очень многословным для меня.

Есть ли лучший способ выразить "вернуть все значения из MethodX" и после этого сделать то же самое для MethodY?

Пример:

private IEnumerable<Node> ParseEmptyElement()
{
    #yield all# items from ParseMembersOfObject();    
    #yield all# items from ParseNestedProperty();
}

Я не хочу быть силой, чтобы записать циклы foreach в одну строку! но я также не хочу писать полноценные циклы foreach с фигурными скобками и все такое:)

1 ответ

Решение

Как прокомментировал Марк, это эквивалентно:

private IEnumerable<Node> ParseEmptyElement()
{
    return ParseMembersOfObject().Concat(ParseNestedProperty());
}

Concat реализован с использованием отложенного выполнения, так что это не будет оценивать ваши перечислимые элементы раньше.

Между прочим, Concat реализуется с foreach циклы в одной строке:

static IEnumerable<TSource> ConcatIterator<TSource>(IEnumerable<TSource> first, 
                                                    IEnumerable<TSource> second) {
    foreach (TSource element in first) yield return element;
    foreach (TSource element in second) yield return element;
}

Если вам не нравится Concat, и вам все еще нужны фигурные скобки, вы можете сохранить их и просто отформатировать код более кратко:

private IEnumerable<Node> ParseEmptyElement()
{
    foreach (var node in ParseMembersOfObject()) { yield return node; }
    foreach (var node in ParseNestedProperty())  { yield return node; }
}
Другие вопросы по тегам