Как всегда сохранять n элементов коллекции?

#c# #collections

#c# #Коллекции

Вопрос:

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

Удаляйте старые элементы при добавлении нового.

сохраняйте n элементов коллекции

Это то, что я сделал:

 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. если вы в основном добавляете в конец и удаляете с начала, то Queue мне кажется, что a имеет наибольший смысл.

2. Хорошо, спасибо за ваше мнение ^^ Есть ли какой-либо другой способ сделать это?

3. Наиболее эффективным способом сделать это является циклический буфер, о котором упоминал ГРЭГИН, хотя в реализации нет сборки. Итак, это действительно зависит от того, как именно вы хотите использовать коллекцию за пределами ограничения. В частности, вам нужен доступ к разным индексам. Вам когда-нибудь нужно было удалять элементы из середины коллекции?

Ответ №1:

Что вам нужно, так это циклический буфер. Существует множество реализаций. Вот один.

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

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

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

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