Все объекты гарантированно имеют метод .equals()
, поскольку Object содержит метод, .equals()
, который возвращает логическое значение. Задача подкласса переопределять этот метод, если требуется дополнительное определение определения. Без него (т. Е. С помощью ==
) только адреса памяти проверяются между двумя объектами для равенства. String переопределяет этот метод .equals()
и вместо использования адреса памяти возвращает сравнение строк на уровне символа для равенства.
Ключевое замечание состоит в том, что строки хранятся в одном пуле, поэтому после создания строки он всегда хранится в программе по тому же адресу. Строки не меняются, они неизменяемы. Вот почему это плохая идея использовать регулярную конкатенацию строк, если у вас есть серьезное количество обработки строк. Вместо этого вы будете использовать предоставленные классы StringBuilder
. Помните, что указатели на эту строку могут измениться, и если вам было интересно увидеть, были ли два указателя одинаковыми ==
, это был бы прекрасный способ. Строки сами не делают.
Я полагаю, что вы используете VB.net. Если да, то это то, что вы пытаетесь?
Public Class Form1
'~~> Adding sample items for demonstration purpose
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With ListBox2.Items
.Add ("Vehicle-Vehicle")
.Add ("Sid")
.Add ("Vehicle-Pedestrian")
.Add ("Sid")
.Add ("Vehicle-Bicycle/Others")
.Add ("Sid")
.Add ("Vehicle-Animal")
End With
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim coa As String = ""
Dim displayar As String = ""
'~~> Loop though selected items of the listbox
For i As Integer = 0 To ListBox2.SelectedItems.Count - 1
coa = coa & "," & ListBox2.SelectedItems(i)
Next i
'~~> Check if there is something or not in coa
If String.IsNullOrEmpty(coa) Then
displayar = 99
Else
Dim arr = Split(coa, ",")
Dim arrv() As String
ReDim arrv(UBound(arr))
Dim n As Integer = 0
'~~> Loop though the array and check it's values
For i As Integer = 0 To UBound(arr)
Select Case arr(i)
Case "Vehicle-Vehicle": arrv(n) = 1
Case "Vehicle-Pedestrian": arrv(n) = 2
Case "Vehicle-Bicycle/Others": arrv(n) = 3
Case "Vehicle-Animal": arrv(n) = 4
Case Else: arrv(n) = 99
End Select
n += 1
Next i
'~~> Get the complete string without looping
displayar = Join(arrv, ",")
End If
MessageBox.Show (displayar)
End Sub
End Class
Если я выберу все элементы, то результат будет 99,1,99,2,99,3,99,4
, а если я ничего не выберу, то будет 99
[ 114]
Переменная «arrv» не может иметь индекс, поскольку она не является массивом.
Переменная coa
не объявлена в вашем коде. Итак, я предполагаю, что это вариант. Вы присваиваете ему значение "" в начале вашего кода, и это делает его вариантом строкового типа. Затем ваш код проверяет, действительно ли оно имеет нулевое строковое значение, что выглядит излишним, поскольку вы просто присвоили ему это значение, но если оно действительно имеет это значение, ваш код переходит к присвоению ему массива. Это превращает его в вариант типа массива. Обратите внимание, что массив не может иметь значение "". Я предлагаю вам объявить cao
тем, кем вы хотите, и относиться к нему как к такому.
Массив, присвоенный cao, является массивом всех элементов, выбранных в ListBox. Это может быть ни один или несколько. Нет возможности узнать, посмотрев на код.
Однако, For i = 0 To partab.ListBox2.ListCount - 1
пытается прочитать все значения в ListBox из массива cao
. Это должно быть возможно только в том случае, если были выбраны все элементы в ListBox, поскольку cao
содержит только выбранные элементы. Поэтому строка If arr(i) = "Vehicle-Vehicle" Then
должна выдавать ошибку индекса, когда i больше, чем UBound (cao).
Предлагаю отформатировать цикл как For i = LBound(cao) To UBound(cao)
. Это вылечит эту конкретную ошибку. Могут быть и другие.