Должен .NET IList быть конечным? Предположим, что я пишу класс FibonacciList, реализующий IList<BigInteger>
- Свойство Item [n] возвращает n-й номер Фибоначчи.
- Свойство IsReadOnly возвращает true.
- Методы IndexOf и Contains мы можем реализовать достаточно легко, потому что последовательность Фибоначчи возрастает - чтобы проверить, является ли число m Фибоначчи, нам нужно только вычислить конечную последовательность чисел Фибоначчи с точностью до m.
- Метод GetEnumerator() делает правильную вещь
Теперь мы реализовали все методы, ожидаемые от ILIS только для чтения, кроме Count().
Это круто или злоупотребление IList?
Числа Фибоначчи быстро становятся непрактично большими (следовательно, IList<BigInteger>
выше). Ограниченная бесконечная последовательность может быть более разумной, она может реализовать IList<long>
или IList<double>
.
Добавление II: последовательность Фибоначчи, возможно, была плохим примером, поскольку вычисление отдаленных значений дорого - для нахождения n-го значения нужно вычислить все более ранние значения. Таким образом, как сказал Мошмондор, можно сделать его IEnumerable и использовать .ElementAt
. Однако существуют другие последовательности, где можно быстро вычислить отдаленные значения без вычисления более ранних значений. (Удивительно, что цифры pi являются такой последовательностью). Эти последовательности более "перепутаны", они действительно поддерживают произвольный доступ.
Изменить: Никто не возражает против бесконечных IEnumerables. Как они обрабатывают Count()?