我有一个包含一些值的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
你可以写
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)
将它们转换为字符串。
正如我在您添加的代码示例中所看到的,您正在比较2个TextBoxes的行并将结果归为第3个,您可以使用这2个代码行完成
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
(这是一个String)转换为Char,并使用Split
中找到的第一个char调用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