#.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
.