Более современное решение
Если вам не требуется, чтобы внутренняя коллекция была изменяемой, вы можете использовать пакет System.Collections.Immutable
, изменить тип поля на неизменяемый, а затем выставить его непосредственно - при условии, что сам Foo
является неизменным, конечно.
Обновленный ответ для более непосредственного решения вопроса
Есть ли причина выставлять внутреннюю коллекцию как коллекцию ReadOnlyCollection, а не IEnumerable, если вызывающий код выполняет итерацию только по коллекции?
Это зависит от того, насколько вы доверяете вызывающему коду. Если вы полностью контролируете все, что когда-либо вызовет этот участник, и вы гарантируете , что ни один код никогда не будет использовать:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
тогда конечно, никакого вреда не будет, если вы просто вернете коллекцию напрямую. Я обычно стараюсь быть немного более параноиком, чем это.
Точно так же, как вы говорите: если вам всего лишь нужно IEnumerable<T>
, тогда зачем связывать себя с чем-то более сильным?
Оригинальный ответ
Если вы используете .NET 3.5, вы можете избежать копирования и , избегая простого приведения, используя простой вызов Skip:
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(Существует множество других опций для тривиального переноса - приятная вещь в Skip
по сравнению с Select / Where - нет делегата для бессмысленного выполнения для каждой итерации.)
Если вы не используете .NET 3.5, вы можете написать очень простую оболочку для того же:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}