Как всегда сохранить n элементов коллекции? - PullRequest
3 голосов
/ 08 марта 2019

Каков наилучший способ сохранить n элементов коллекции в c #?

Удалить старые элементы при добавлении новых.

keep n elements of a collection

Вот что я сделал:

List<int> listOf5Elements = new List<int>();
for(var i = 0; i<200; i++)
{
    listOf5Elements.Add(i);
    if (listOf5Elements.Count() == 6)
        listOf5Elements.RemoveAt(0);
}

LinkedList<int> linkedOf5elements = new LinkedList<int>();
for (var i = 0; i < 200; i++)
{
    linkedOf5elements.AddLast(i);
    if (linkedOf5elements.Count() == 6)
        linkedOf5elements.RemoveFirst();
}

Queue<int> queueOf5Elements = new Queue<int>();
for (var i = 0; i < 200; i++)
{
    queueOf5Elements.Enqueue(i);
    if (queueOf5Elements.Count() == 6)
        queueOf5Elements.Dequeue();
}

Есть ли другой способ сделать это?

1 Ответ

5 голосов
/ 08 марта 2019

То, что вы хотите, это кольцевой буфер . Есть много реализаций там. Вот один .

Он эффективен как во времени, так и в пространстве; во времени, потому что вставка имеет значение O (1) , а в пространстве - потому что новый элемент перезаписывает самый старый на месте.

Ваша первая попытка неэффективна, потому что RemoveAt(0) - это O (n) , потому что элементы должны сместиться.

Второй не так уж и плох, но имеет некоторые накладные расходы при выделении нового слота и удалении старого.

Третья попытка является наилучшей, потому что очередь .NET реализуется как кольцевой буфер, но есть некоторые накладные расходы, связанные с изменением размера. Поскольку вам не нужно изменять размер, настоящий кольцевой буфер с фиксированным размером будет немного более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...