Получить значения ListBox и TextBox, соответствующие VB.NET - PullRequest
0 голосов
/ 25 января 2019

У меня есть listbox1, содержащий некоторые значения

value 1
value 2
value 3
value 4
value 5

и TextBox1, содержащий несколько строк

Value 3
Value 5
Value 10
Value 14

Я хочу получить соответствующие значения в listbox1 и TextBox1, например

Value 3
Value 5

и выполните код действия, если значения совпадают, и выполните цикл до последнего совпадения значения

Я использовал этот код, но он не дает точного вывода.

Dim compare As String
Dim comparear() As String
Dim list As String
Dim listar() As String

compare = TextBox1.Text
comparear = compare.Split(vbNewLine)
list = TextBox2.Text
listar = list.Split(vbNewLine)
For i = 0 To comparear.Length - 1
    For p = 0 To listar.Length - 1
        If listar(p).Contains(comparear(i)) Then
            txt_match.Text = txt_match.Text & listar(p) & vbNewLine
        Else
        End If
    Next
Next

1 Ответ

0 голосов
/ 25 января 2019

Вы можете написать

Dim result = listBox1.Items.OfType(Of String).Intersect(textBox1.Lines)

результат имеет тип IEnumerable(Of String).То есть вы можете использовать его в For Each или добавить .ToList или .ToArray, чтобы получить коллекцию.

Обратите внимание, что совпадение чувствительно к регистру.Если вы хотите игнорировать регистр, вы можете написать

Dim result = listBox1.Items.OfType(Of String) _
    .Intersect(textBox1.Lines, StringComparer.OrdinalIgnoreCase)

Поскольку элементы ListBox возвращаются как объекты, я использовал listBox1.Items.OfType(Of String) для преобразования их в строки.


AsЯ вижу в примере кода, который вы добавили, вы сравниваете строки из 2 текстовых блоков и объединяете результат в 3-ю, вы можете сделать это с помощью этих двух строк кода

Dim result = textBox1.Lines.Intersect(textBox2.Lines, StringComparer.OrdinalIgnoreCase)
txt_match.Text = String.Join(vbNewLine, result)

Если вы хотите сравнить элементы 2 ListBoxes

Dim r = listBox1.Items.OfType(Of String) _
    .Intersect(listBox2.Items.OfType(Of String), StringComparer.OrdinalIgnoreCase)

Intersect работает с любыми двумя перечислениями или коллекциями одного типа

A.Intersect(B)

возвращает IEnumerable(Of T), где оба A и B сами по себе IEnumerable(Of T).Поэтому не имеет значения, используете ли вы строки TextBox, Items ListBox, приведенные к T, или массивы или List(Of T) или что-то еще.


Ваш код не работает из-за 2 разных ошибок:

  • У вас есть Option Strict Off.Это скрывает ошибку, показывающую, что вы вызываете неправильную перегрузку Split.VB пытается преобразовать vbNewLine (который является строкой) в символ и вызывает Split с первым символом, найденным в vbNewLine.Используйте Option Strict On в своем проекте, и вы получите ошибку компиляции.Напишите это вместо
comparear = compare.Split(New String() {vbNewLine}, StringSplitOptions.RemoveEmptyEntries)
listar = list.Split(New String() {vbNewLine}, StringSplitOptions.RemoveEmptyEntries)
  • Ваше совпадение чувствительно к регистру.Вместо этого сравните, как это
If listar(p).ToLowerInvariant = comparear(i).ToLowerInvariant Then
...