Удаление строк из массива
У меня есть массив строк, и я хочу в какой-то момент стереть некоторые из них. Вот пример кода:
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
Я собирался написать вам пример, но понял, что не знаю точно, что вы пытаетесь сделать. Могли бы вы объяснить?