Вложенный возврат урожая с IEnumerable

Я думаю, что хорошее место для запуска с Ninject, это является новым и приняло во внимание большую точную настройку и является действительно быстрым. У Nate, разработчика, действительно есть большой сайт и большая поддержка.

158
задан John Oxley 13 August 2009 в 09:09
поделиться

3 ответа

Это определенно не глупый вопрос, и это то, что F # поддерживает с помощью yield! для всей коллекции по сравнению с yield для отдельного элемента. (Это может быть очень полезно с точки зрения хвостовой рекурсии ...)

К сожалению, это не поддерживается в C #.

Однако, если у вас есть несколько методов, каждый из которых возвращает IEnumerable , вы можно использовать Enumerable.Concat , чтобы упростить код:

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    return GetMoreErrors(card).Concat(GetOtherErrors())
                              .Concat(GetValidationErrors())
                              .Concat(AnyMoreErrors())
                              .Concat(ICantBelieveHowManyErrorsYouHave());
}

Тем не менее, есть одно очень важное различие между двумя реализациями: этот вызовет все методы немедленно , даже если он будет использовать только возвращенные итераторы по одному. Ваш существующий код будет ждать, пока он '

136
ответ дан 23 November 2019 в 21:41
поделиться

Я не вижу ничего плохого в вашей функции, я бы сказал, что она делает то, что вы хотите.

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

Если вы добавляете последующие выходы позже в методе, он продолжит добавлять 1 элемент в перечисление, что позволяет делать такие вещи, как ...

public IEnumerable<string> ConcatLists(params IEnumerable<string>[] lists)
{
  foreach (IEnumerable<string> list in lists)
  {
    foreach (string s in list)
    {
      yield return s;
    }
  }
}
8
ответ дан 23 November 2019 в 21:41
поделиться

Да, можно вернуть сразу все ошибки. Просто верните List или ReadOnlyCollection .

Возвращая IEnumerable , вы возвращаете последовательность чего-то. На первый взгляд это может показаться идентичным возврату коллекции, но есть ряд отличий, о которых следует помнить.

Коллекции

  • Вызывающий может быть уверен, что и коллекция, и все элементы будут существовать, когда коллекция возвращается. Если коллекция должна создаваться для каждого вызова, возвращение коллекции - действительно плохая идея.
  • Большинство коллекций могут быть изменены при возврате.
  • Коллекция имеет конечный размер.

Последовательности

  • Можно перечислить - и это почти все, что мы можем сказать с уверенностью.
  • Сама возвращенная последовательность не может быть изменена.
  • Каждый элемент может быть создан как часть выполнения последовательности (т. Е. Возвращение IEnumerable допускает ленивую оценку, возвращая List < T> нет).
  • Последовательность может быть бесконечной, и поэтому вызывающая сторона сама решает, сколько элементов должно быть возвращено.
3
ответ дан 23 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: