IEnumerable понимание против возвращения типа коллекции - PullRequest
2 голосов
/ 26 января 2012

Есть ли когда-либо обстоятельства, когда следующее:

public IEnumerable<Foo> Foobar (Bar bar)
{
    List<Foo> result = new List<Foo>()
    foreach(var Qux in bar.QuxSource)
    {
        Foo item;
        ... //a procudure that is intricate enough not to be clearly repressentable with a LINQ method
        result.Add(item);
        ... //The aforementioned inticate proceduce continues. Possiblily adding more items to result
    }
    return result;
}

Предпочтительнее:

public IEnumerable<Foo> Foobar (Bar bar)
{
    foreach(var Qux in bar.QuxSource)
    {
        Foo item;
        ... //a procudure that is intricate enough not to be clearly repressentable with a LINQ method
        yield return item;
        ... //The aforementioned inticate proceduce continues. Possiblily yielding more items
    }
}

Я имею в виду, что последнее явно замечательно.Со славой побежденной операции, если я использую только Foobar (someBar) .irst (), он не должен генерировать все возвращаемые элементы.

Я вижу, что первое использовалось много, особенно опытными программистами.(Кто, я думаю, не обновляется со списками в современном C #).Так лучше ли бывшему патерну при некоторых обстоятельствах?(глядя только на библиотечный код, нацеленный на повторное использование) Я думаю, может быть, когда возможность создания элементов зависит от какого-то внешнего ресурса, такого как наличие открытого файла.Каков вариант использования foreach?Я думаю, это

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Ваш пример использования является правильным, но в более общем случае вы, вероятно, захотите принять прежний шаблон, если:

  • Источник использует ограниченный ресурс, и вам нужно гарантировать, что перечислительбудет ликвидирован (если вы начнете перечисление при последнем подходе и остановитесь посередине, не выбрасывая счетчик, он останется открытым)
  • Источник должен быть перечислен как можно быстрее
  • Вы должны гарантировать, что весь источник оценен
2 голосов
/ 26 января 2012

Первый подход - активное перечисление исходной последовательности - предпочтителен, когда доступ к исходной последовательности ограничен во времени или должен быть ограничен узким временным окном - т.е. это имеет место при извлечении данных из базы данных с использованием Linq для Поставщик SQL или Linq to Entities. При втором подходе вы зависите от потребителя, который перечислит ваш источник, что может занять гораздо больше времени - в общем, вы не хотите, чтобы ваше соединение с базой данных было открыто так долго.

...