Ну, так как вы упомянули стек, я думаю, вам нужны только изменения в конце списка?
В этом случае список на самом деле является хорошим решением (эффективный кэш и с быстрой вставкой / удалениемконец).Однако ваш способ извлечения последних нескольких элементов несколько неэффективен, потому что IEnumerable<T>
не будет предоставлять произвольный доступ, предоставленный списком.Таким образом, Skip()
-Implementation должен сканировать весь List, пока он не достигнет конца (или сначала выполнить проверку типа во время выполнения, чтобы обнаружить, что контейнер реализует IList<T>
).Более эффективно либо получить доступ к элементам напрямую по индексу, либо (если вам нужен второй массив) использовать List<T>.CopyTo()
.
Если вам нужно быстрое удаление / вставка в начале, вы можете захотетьрассмотрим кольцевой буфер или (дважды) связанный список (см. LinkedList<T>
).Связанный список будет менее эффективен для кэширования, но его легко и эффективно перемещать и изменять в обоих направлениях.Кольцевой буфер немного сложнее реализовать, но он будет более кэш- и пространственно-эффективным.Так что, вероятно, лучше, если будут храниться только небольшие типы значений или ссылочные типы.Особенно, когда размер буферов фиксирован.