Вы можете выставить его как IEnumerable<T>
и по-прежнему вести индексирование через LINQ .ElementAt
и .Count
. Если базовая коллекция поддерживает IList<T>
, это все еще операции O (1), поскольку LINQ достаточно умен, чтобы оптимизировать реализацию списка. Конечно, .ElementAt
не так лаконичен, как индексатор, но также дает вам гибкость, если базовая реализация изменяется на коллекцию, которая не поддерживает индексацию напрямую. Если вы не хотите использовать этот подход, нетрудно создать класс-оболочку, который реализует индексатор только для чтения и делегирует все вызовы базовому списку.