Удаление элементов из списка с условием (VB)

#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. Правильно, я не тестировал второй пример.