Как исправить ошибку при преобразовании списка в массив и последующем сравнении массива?

Все объекты гарантированно имеют метод .equals(), поскольку Object содержит метод, .equals(), который возвращает логическое значение. Задача подкласса переопределять этот метод, если требуется дополнительное определение определения. Без него (т. Е. С помощью ==) только адреса памяти проверяются между двумя объектами для равенства. String переопределяет этот метод .equals() и вместо использования адреса памяти возвращает сравнение строк на уровне символа для равенства.

Ключевое замечание состоит в том, что строки хранятся в одном пуле, поэтому после создания строки он всегда хранится в программе по тому же адресу. Строки не меняются, они неизменяемы. Вот почему это плохая идея использовать регулярную конкатенацию строк, если у вас есть серьезное количество обработки строк. Вместо этого вы будете использовать предоставленные классы StringBuilder. Помните, что указатели на эту строку могут измениться, и если вам было интересно увидеть, были ли два указателя одинаковыми ==, это был бы прекрасный способ. Строки сами не делают.

0
задан Pᴇʜ 17 January 2019 в 09:42
поделиться

3 ответа

Я полагаю, что вы используете 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]

0
ответ дан Siddharth Rout 17 January 2019 в 09:42
поделиться

Переменная «arrv» не может иметь индекс, поскольку она не является массивом.

0
ответ дан Sviat Lavrinchuk 17 January 2019 в 09:42
поделиться

Переменная 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). Это вылечит эту конкретную ошибку. Могут быть и другие.

0
ответ дан Variatus 17 January 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: