Подтвердить что ты не робот

С#: диапазон возврата урожая/коллекция

Я использую ключевое слово yield return совсем немного, но мне не хватает, когда я хочу добавить диапазон к IEnumerable. Вот краткий пример того, что я хотел бы сделать:

IEnumerable<string> SomeRecursiveMethod()
{
    // some code 
    // ...
    yield return SomeRecursiveMethod();
}

Естественно, это приводит к ошибке, которая может быть решена путем выполнения простого цикла. Есть лучший способ сделать это? Петля кажется немного неуклюжей.

4b9b3361

Ответ 1

Нет, я не боюсь. F # поддерживает это с помощью yield!, но в С# нет эквивалента - вы должны использовать цикл в основном. Извини... Я чувствую твою боль. Я упомянул об этом в одном из моих сообщений в блоге Edulinq, где это упростило бы работу.

Обратите внимание, что рекурсивно возвращать выходную доходность может быть дорогостоящим - см. сообщение Wes Dyer на итераторах для получения дополнительной информации (и упоминание "доходности foreach", который рассматривался на четыре года назад...)

Ответ 2

Если у вас уже есть цикл IEnumerable, и тип возврата IEnumerable (как и в случае с функциями, которые могут использовать yield return), вы можете просто вернуть это перечисление.

Если у вас есть случаи, когда вам нужно комбинировать результаты с несколькими IEnumerable s, вы можете использовать метод расширения IEnumerable<T>.Concat.

В вашем рекурсивном примере вам нужно завершить перечисление/конкатенацию на основе содержимого перечисления. Я не думаю, что мой метод будет поддерживать это.

Ответ 3

Ключевое слово yield действительно очень приятно. Но вложение в цикл for приведет к созданию и исполнению большего количества кода клея.

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

 void GenerateList(List<string> result)
 {

      result.Add("something")

      // more code.

      GenerateList(result);

 }