If the most common pattern of the list is to iterate through all the elements, IEnumerable<T> or IQueryable<T> can effectively act as a read-only list as well.
Create an extension method ToReadOnlyList() on IEnumerable, then
IEnumerable<int> ints = new int[] { 1, 2, 3 };
var intsReadOnly = ints.ToReadOnlyList();
//intsReadOnly [2]= 9; //compile error, readonly
here is the extension method
public static class Utility
{
public static IReadOnlyList<T> ToReadOnlyList<T>(this IEnumerable<T> items)
{
IReadOnlyList<T> rol = items.ToList();
return rol;
}
}