#c# #collections
#c# #Коллекции
Вопрос:
Какой наилучший способ сохранить n элементов коллекции в c #?
Удаляйте старые элементы при добавлении нового.
Это то, что я сделал:
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 заполнена как циклический буфер, но есть некоторые накладные расходы, связанные с изменением размера. Поскольку вы не заботитесь об изменении размера, настоящий циклический буфер с фиксированным размером был бы немного более эффективным.