#vb.net #list #while-loop
#vb.net #Список #во время цикла
Вопрос:
У меня есть список
Dim list As New List(Of Double)
Я хочу удалить последние записи, если различия> 20.
Моя идея проверить последние 30 записей:
Do While index >= list.Count - 30
If Math.Sqrt((list(index) - list(index 1)) ^ 2) > 20 Then
list.RemoveAt(index)
Exit Do
End If
Loop
Это не приводит к моему решению. Кто-нибудь может помочь? Большое вам спасибо.
Комментарии:
1. Извините, позвольте мне лучше понять. Предположим, у вас есть список из 50 двойников. Вы хотите удалить, начиная с конца списка, все элементы, для которых выполнено условие из вашего кода, и при первом двойном, который не удовлетворяет условию, вы бы остановили цикл (даже если есть другие элементы, которые удовлетворяют условию в более низких индексах)?
2. точно, Стив. извините, что не описал это идеально.
Ответ №1:
Вместо использования списка двойников я бы использовал LinkedList двойников, чтобы использовать методы и свойства класса, такие как addFirst, Last, Last.Предыдущая страница
Итак, давайте предположим, что у вас есть LinkedList, объявленный как
Dim list As New LinkedList(Of Double)
И вы добавили элементы в этот список с помощью
list.AddFirst(134.5678)
Теперь вы можете удалить из конца списка что-то вроде этого
' You want to have a list of at least 30 elements
Do While list.Count > 30
' Last node and the previous one
Dim dLast = list.Last
Dim dLastPrev = list.Last.Previous
' Evaluate the two elements
If Math.Sqrt(dLastPrev.Value - dLast.Value) ^ 2 > 20 Then
' Remove the last and continue to evaluate the next pair
list.RemoveLast()
Else
' Stop if the condition is not met.
Exit Do
End If
Loop
Конечно, это также можно сделать, используя ваш текущий тип списка.
Также обратите внимание, как я поменял местами два элемента для проверки. Это сделано, чтобы избежать любой возможности исключения IndexOutOfRangeException
Dim index as Integer = list.Count - 1
Do While index >= list.Count - 30
Dim prev = index - 1
If Math.Sqrt((list(prev) - list(index)) ^ 2) > 20 Then
list.RemoveAt(index)
else
Exit Do
End If
index = index - 1
Loop
Комментарии:
1. Большое вам спасибо, Стив, теперь все работает нормально! По какой-то причине мне пришлось объявить Dim index как Integer = list . Count — 1 В противном случае я получаю исключение IndexOutOfRangeException.
2. Правильно, я не тестировал второй пример.