Soluzione più moderna
A meno che non sia necessario che la raccolta interna sia mutabile, è possibile utilizzare il System.Collections.Immutable
pacchetto, modificare il tipo di campo in una raccolta immutabile e quindi esporlo direttamente - presupponendo che Foo
sia immutabile, ovviamente.
Risposta aggiornata per rispondere alla domanda in modo più diretto
C'è qualche motivo per esporre una raccolta interna come ReadOnlyCollection anziché IEnumerable se il codice chiamante scorre solo sulla raccolta?
Dipende da quanto ti fidi del codice chiamante. Se hai il controllo completo su tutto ciò che chiamerà mai questo membro e garantisci che nessun codice verrà mai utilizzato:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
quindi certo, non verrà fatto alcun danno se si restituisce direttamente la raccolta. In genere cerco di essere un po 'più paranoico di quello.
Allo stesso modo, come dici: se ne hai solo bisogno IEnumerable<T>
, perché legarti a qualcosa di più forte?
Risposta originale
Se stai usando .NET 3.5, puoi evitare di fare una copia ed evitare il cast semplice usando una semplice chiamata a Skip:
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(Esistono molte altre opzioni per Skip
eseguire il wrapping banalmente: la cosa bella di oltre Select / Where è che non c'è delegato da eseguire inutilmente per ogni iterazione.)
Se non stai utilizzando .NET 3.5 puoi scrivere un wrapper molto semplice per fare la stessa cosa:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
ReadOnlyCollection
se sei paranoico, ma ora non sei legato a un'implementazione specifica.