2014-01-27 2 views
0

Я пытаюсь найти массив для предыдущих записей из введенного пользователем текстового поля, соответствующего новым входящим записям. Есть ли способ сделать это в Visual Basic? Я конвертирую свой код из C#, и Visual Basic продолжает давать мне ошибку «Ссылка на объект не установлена ​​в экземпляр объекта». С помощью этого оператора код пропускает блок if для проверки соответствия текста, потому что arrayName (i) или 0 в этом случае в настоящее время НИЧЕГО. Если я выберу этот блок if, и он достигнет проверки имени, тогда он вызывает ошибку, потому что в arrayName (i) нет ничего, чтобы преобразовать в верхнюю строку.поиск визуального базового массива

Итак, вот мой код. Мой вопрос снова состоял в том, что есть более простой способ поиска предыдущих записей из массива на новые входные записи.

Edit: подробности

Это объявление массива Dim arrayName() = New String(2) {} и когда он получает Если имяМассива (я) .ToString.ToUpper = txtInput.Text.ToUpper Тогда он говорит: «Объект переменная или переменная блока не установлена. " «NullReferenceException был необработанным кодом пользователя». «X» в коде является фиксированной длиной массива, которая в этом случае равна 2.

Dim i As Integer = 0 
      While x >= i 
       If arrayName(i) IsNot Nothing Then 
        If arrayName(i).ToString.ToUpper = txtInput.Text.ToUpper Then 
         match = False 
         lblName.Text = "Enter a unique name" 
        End If 
       End If 
        i += 1 
      End While 
+0

У вас, вероятно, есть тот же вопрос, что и этот поток :) Проверьте это. http://stackoverflow.com/questions/697270/how-can-i-search-an-array-in-vb-net –

+0

Какая строка конкретно вызывает исключение? Исключение предоставляет вам эту информацию. Что говорит отладчик, когда вы проходите через код? Что такое объявление 'arrayName'? –

+0

@Tim oh wait :) Ваш вопрос об ошибке, которая появляется или «более простой способ поиска предыдущих записей из массива на новые входные записи»? или оба? –

ответ

0

Ваш фрагмент кода не определен x.

Вы можете найти свой массив эффективно с немного LINQ:

Dim listFound As IEnumarable(String) = From item In arrayName _ 
             Where item.ToString.ToUpper _ 
             = txtInput.Text.ToUpper _ 
             Select item 
If listFound.Count > 0 Then 
    lblName.Text = "Enter a unique name" 
End If 

Или вы можете вручную искать массив, но я думаю, что это более эффективно, что метод вы используете:

Dim Match As Boolean = False 

For i As Integer = 0 To arrayName.Count - 1 
    If Not IsNothing(arrayName(i)) Then 
     If arrayName(i).ToString.ToUpper = txtInput.Text.ToUpper Then 
      Match = True 
      Exit For 
     End If 
    End If 
Next 
If Match Then 
    lblName.Text = "Enter a unique name" 
End If 

Два последних примечания: arrayName(i).ToString.ToUpper равнозначно UCase(arrayName(i)). Вы можете выполнить некоторые тесты скорости, чтобы увидеть, что на самом деле быстрее.

Также Dim myArray As String(3) не то же самое в VB, что и Dim myArray() = New String(3) {}. Первый пример приводит к 1-мерному массиву. В последнем примере получается двумерный массив.

+0

x - это только фиксированная длина моего массива – Tim

+0

Нет, он не определен вообще. Вы явно показываете определение и инстанцирование i. Если 'x' определено, почему бы не включить его в образец кода? –

+0

Потому что есть намного больше кода, который не имеет отношения к вопросу. Это просто массив с фиксированной длиной, но не инициализирован никакими данными. – Tim

1

Поскольку вы не хотите использовать встроенные функции поиска ... Попробуйте это ...

Объявите это в рамках Глобальной Scope ... Так поместите его под класс формы ...

Dim counter As Integer = 0 
Dim arrayname(10) As String 

Добавить кнопки управления ... и добавить этот код ...

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    If counter < 10 Then 
     Dim input As String = InputBox("Please input name.") 
     If input = "" Then 
      MsgBox("Nothing entered!") 
      Exit Sub 
     End If 
     For x = 0 To 10 
      If UCase(input) = UCase(arrayname(x)) Then 
       MsgBox("Duplicate name!") 
       Exit Sub 
      End If 
     Next x 
     arrayname(counter) = input 
     counter += 1 
    Else 
     MsgBox("Array full!") 
    End If 
End Sub 

Вот и все. Редактируйте в соответствии с вашими точными потребностями. Скажите, если это сработает :)

+0

У этого есть проблема! Я могу ввести одну и ту же строку много раз, и по какой-то причине она не воспринимает их как совпадение. Я прошел через код, и он выполняет инструкцию сравнения, но каждый раз добавляет в Else, чтобы добавить в массив – Tim

+0

@Tim My bad. Лол, я уже отредактировал ... Попробуй. –

+0

Он все еще делает это:/ – Tim

Смежные вопросы