То, что вы хотите, это кольцевой буфер . Есть много реализаций там. Вот один .
Он эффективен как во времени, так и в пространстве; во времени, потому что вставка имеет значение O (1) , а в пространстве - потому что новый элемент перезаписывает самый старый на месте.
Ваша первая попытка неэффективна, потому что RemoveAt(0)
- это O (n) , потому что элементы должны сместиться.
Второй не так уж и плох, но имеет некоторые накладные расходы при выделении нового слота и удалении старого.
Третья попытка является наилучшей, потому что очередь .NET реализуется как кольцевой буфер, но есть некоторые накладные расходы, связанные с изменением размера. Поскольку вам не нужно изменять размер, настоящий кольцевой буфер с фиксированным размером будет немного более эффективным.