С#: диапазон возврата урожая/коллекция
Я использую ключевое слово yield return
совсем немного, но мне не хватает, когда я хочу добавить диапазон к IEnumerable
. Вот краткий пример того, что я хотел бы сделать:
IEnumerable<string> SomeRecursiveMethod()
{
// some code
// ...
yield return SomeRecursiveMethod();
}
Естественно, это приводит к ошибке, которая может быть решена путем выполнения простого цикла. Есть лучший способ сделать это? Петля кажется немного неуклюжей.
Ответы
Ответ 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);
}