C #: диапазон доходности / коллекция - PullRequest
42 голосов
/ 24 марта 2011

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

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

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

Ответы [ 3 ]

45 голосов
/ 24 марта 2011

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

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

5 голосов
/ 24 марта 2011

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

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

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

0 голосов
/ 24 марта 2011

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

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

 void GenerateList(List<string> result)
 {

      result.Add("something")

      // more code.

      GenerateList(result);

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...