Лучший способ реализовать список (Of) с максимальным количеством элементов

#.net #vb.net #list

#.net #vb.net #Список

Вопрос:

Я пытаюсь найти хороший способ реализации списка (Of), который содержит максимальное количество записей.

например

У меня есть список (из Int32) — он заполняется новым элементом Int32 каждые 2 секунды.

Я хочу сохранить только самые последние 2000 элементов.

Как я могу сделать так, чтобы список содержал максимум 2000 элементов, тогда при попытке добавления 2001-го элемента из списка выпадал 2000-й элемент (в результате чего текущее общее количество равнялось 1999).

Дело в том, что мне нужно убедиться, что я удаляю только самый старый элемент и добавляю новый элемент в список.

Ben

Комментарии:

1. Язык программирования был бы полезным тегом на данном этапе.

Ответ №1:

Попробуйте это…

 if(list.Count >= 2000)
    list.RemoveAt(0); 
list.Add(item);
  

Комментарии:

1. Я только что исправил небольшую ошибку там для вас (когда вы добавляете элемент после проверки размера)

2. @Джастин, спасибо за исправление. На моем мобильном устройстве и не так просто выполнять части кода 😉

Ответ №2:

Если вы хотите использовать a List(Of T) вместо другого типа коллекции, вы можете перегрузить Add() -метод:

 Public Class ListOf2000(Of T)
    Inherits List(Of T)

    Public Overloads Sub Add(item As T)
        MyBase.Add(item)
        If Me.Count = 2001 Then Me.RemoveAt(0)
    End Sub

End Class
  

Ответ №3:

Структура очереди — это то, что вам нужно. Добавляйте элементы в очередь по мере их поступления. Удалять элементы из очереди можно только при размере > 2000

Ответ №4:

Вы можете использовать, например, круговой список (связанный список с 2000-м элементом, указывающим на первый). Добавление нового элемента добавляет «следующий элемент» к текущему указателю.

Когда вы добавите 2001-й элемент, он заменит первый созданный вами элемент, т. е. самый старый.

Однако также было бы интересно узнать, как вы хотите получить доступ к данным в вашей структуре.

Комментарии:

1. Спасибо (всем) за их ответы. Я рассмотрю, как создать круговой список (никогда не слышал об этом раньше). Позже я получу доступ к данным с помощью запроса Linq, чтобы выяснить, существует ли в списке определенный номер Int32. если этого не произойдет, он будет добавлен.

2. Более общим термином является «Циклический буфер»: en.wikipedia.org/wiki/Circular_buffer

Ответ №5:

Используйте очередь. Но это зависит от того, как вам нужно получить доступ к тем, кто находится в списке / очереди.

Ответ №6:

Циклический массив с указателем на начало и конец. Если вы используете CPP, вы могли бы использовать dequeue .