如何比较两个列表框?

时间:2018-07-13 12:38:04

标签: vb.net listbox comparison

我有两个列表框(1:主要,2:次要)。 这些列表框包含数字。主列表框包含7个数字,辅助列表框包含6个数字。

enter image description here

我想比较Primary Listbox和Secondary的值。 这种比较应产生三个结果:

结果1: 发现X个值很常见。

enter image description here

结果#2: 所有数字都匹配。

enter image description here

结果#3: 找不到匹配项。

enter image description here

这是我到目前为止所拥有的:

If lstPrimaryNumbers.Items.Count = 0 Or lstSecondaryNumbers.Items.Count = 0 Then
            MessageBox.Show("There is nothing to compare.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End If

        For i As Integer = 0 To lstPrimaryNumbers.Items.Contains
            For j As Integer = 0 To lstSecondaryNumbers.Items.Contains

                If i = j Then
                    MessageBox.Show(i & " " & j & " matched!")
                End If
            Next
        Next

请注意:

我已更改了整个界面,因此该帖子已过时,现在已经无用。谢谢大家的支持!

我将其留给主持人来决定是删除此帖子还是保留该帖子以供其他用户参考。

我将标记此帖子。

2 个答案:

答案 0 :(得分:2)

找到匹配项

Dim r = lb1.Items.Cast(Of Int32).Where(Function (x) lb2.Items.Contains(x))
MessageBox.Show(String.Join(",", r) & " matched")

如果要完全匹配,请使用IEnumerable.All进行检查

Dim a = lb1.Items.Cast(Of Int32).All(Function (x) lb2.Items.Contains(x))
If a Then
   MessageBox.Show("Full Match")
End If

最后,如果您只想知道某些项目是否匹配,请使用IEnumerable.Any

Dim b = lb1.Items.Cast(Of Int32).Any(Function(x) lb2.Items.Contains(x))
If Not b Then
    MessageBox.Show("No matches where found")
End If

我假设您的项目是整数,但是如果将它们添加为字符串,则需要将 Cast(Of Int32)更改为 Cast(Of String)

答案 1 :(得分:1)

首先,我使用一些linq将ListBoxes的内容放入数组。然后使用.Intersect方法找到匹配项。并显示.Count。您可以使用For Each迭代结果

Private Sub OPCode()
        Dim id1() As Integer = (From i In ListBox1.Items Select CInt(i)).ToArray
        Dim id2() As Integer = (From i In ListBox2.Items Select CInt(i)).ToArray
        Dim Matches As IEnumerable(Of Integer) = id1.Intersect(id2)
        MessageBox.Show(Matches.Count.ToString)
    End Sub
'TextBox1.Multiline = True is set at design time
'Expand the text box size so several lines will be visible
 For Each Match As Integer In Matches
      TextBox1.Text &= (CStr(Match) & Environment.NewLine)
 Next