Удаление строк из массива

У меня есть массив строк, и я хочу в какой-то момент стереть некоторые из них. Вот пример кода:

Dim canvas As New Microsoft.VisualBasic.PowerPacks.ShapeContainer
Dim lines(20) As PowerPacks.LineShape
Dim it As Integer = 0

Private Sub GoldenSpi_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    canvas.Parent = Me
    lines.Initialize()
    iter.Text = 0
End Sub
Private Sub iter_TextChanged(sender As Object, e As EventArgs) Handles iter.TextChanged
   If (it > iter.Text And iter.Text <> 0) Then
        ReDim Preserve lines(iter.Text - 1)
   End If
   If (it <> iter.Text) Then
        it = iter.Text
   End If

   For i As Integer = 1 To iter.Text
      lines(i - 1) = New PowerPacks.LineShape(canvas)
      lines(i - 1).StartPoint = pA(i)
      lines(i - 1).EndPoint = pB(i)
      lines(i - 1).BringToFront()
   Next
End Sub

После выполнения программы строки создаются. Но когда я присваиваю своему текстовому полю значение, которое меньше переменной 'it', оно удаляет только последнюю строку, а не остальную. Также я видел при отладке, что размер массива уменьшается. Значит, содержимое за пределами размера все еще сохраняется? Это почему?. Любая помощь приветствуется. Благодарю.

РЕДАКТИРОВАТЬ: Я пытался создать список, как это:

Dim lines As New Generic.List(Of PowerPacks.LineShape)

Private Sub iter_ValueChanged(blabla) Handles iter.ValueChanged
    If (it > iter.Value And iter.Value <> 0) Then
        lines.RemoveRange(iter.Value - 1, lines.Count - iter.Value)
   End If

   For i As Integer = 1 To iter.Value
      InitPoints()

      If i - 1 = lines.Count Then
        Dim line As New PowerPacks.LineShape
        With line
            .StartPoint = pA(i)
            .EndPoint = pB(i)
            .BringToFront()
            .Parent = canvas
        End With
        lines.Add(line)
      End If
   Next

End Sub

Но все же линии видны в форме. Я отладил его и увидел, что размер списка уменьшился. Та же проблема, когда у меня был массив. Что происходит?...

2 ответа

Я рекомендую изменить iter.Text в cint(iter.Text), поскольку есть вероятность, что оба значения сравниваются как текст (который сравнивается по-разному).

Я также рекомендовал бы изменить Dim lines(20) As PowerPacks.LineShape в Dim lines As new generic.list(of PowerPacks.LineShape)

Таким образом, вам не нужно беспокоиться о ReDim Preserve (что может быть медленным, когда вы делаете это в цикле), и вы можете легко вставлять элементы в любой индекс, если хотите

Вы должны использовать Option Strict On в вашем проекте, чтобы избежать неявного преобразования между типами, которое может привести к ошибкам или, что еще хуже, к неожиданному поведению.

С другой стороны, вы не должны иметь TextBox хранить номера, если в этом нет необходимости. Использовать NumericUpDown, например. Взгляните на документацию MSDN.

А теперь для массива я рекомендую использовать List, в котором реализованы все методы, необходимые для обработки элементов, и .ToArray() метод, который даст вам массив при необходимости.

Попробуйте что-то вроде этого:

Dim it As Integer = 0
Dim lines As New List(Of PowerPacks.LineShape)()

Sub iter_TextChanged(sender As Object, e As EventArgs) Handles iter.TextChanged
    Dim iTxt As Integer

    Try 
        iTxt = Integer.Parse(iter.Text)

        If it > iTxt AndAlso iTxt <> 0 Then

        End If

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try

End Sub

Я собирался написать вам пример, но понял, что не знаю точно, что вы пытаетесь сделать. Могли бы вы объяснить?

Другие вопросы по тегам