比较两个列表框并在文本框中发送差异或相似之处

时间:2018-12-31 10:52:22

标签: vb.net

我已经恢复了代码,再次需要您的帮助。我创建了2个列表框,输入了数据,现在我想比较2个列表框,并在另一个文本框中显示差异和相似之处。我尝试过的一切都不起作用,只是不想要。 我们有以下内容:以及如何在列表框行(即项(1,2,3,4))上完成此操作。如果它是可能的。因为我将向列表框添加更多数据,所以我想将其与其他列表框进行比较。或更简单地说,如何与列表框的第二项进行比较? 例: Listbox1.Items(1)= 1,2,3,4,5 ListBox1.Items(2)= 1,3,4,5,6

Listbox1.Items - with the following item: 1,3,5,11
Listbox2.Items - with the following item - 2,3,6,11

在Textbox1.text中-您想要显示Textbox2.text中的相似点和不同点,例如Listbox1和Listbox2中存在的数字分别是3和11。 然后是区别:Textbox2.text中为1.5,6 我意识到在“列表框”中执行这些操作要容易得多,所以希望您能对我有所帮助。

列表框中的交点比较容易,所以我希望您能对我有所帮助,因为绝对找不到任何有效的代码,这不是很好,只是没有显示出差异或相似之处。

1 个答案:

答案 0 :(得分:0)

首先,我使用.AddRange方法用您的数字填充列表框。

我们本来可以从数组开始的,但是我假设ListBoxes填充在其他地方。将ListBox项目转换为数组。

使用.Intersect方法可以轻松实现交集。第二个有点棘手,因为.Except返回第一个序列中未出现在第二个序列中的元素。因此,我们需要在两个数组上使用.Except并将它们与.Union组合。

Private Sub CompareListBoxes()
    ListBox1.Items.AddRange(New Object() {1, 3, 5, 11})
    ListBox2.Items.AddRange(New Object() {2, 3, 6, 11})
    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)
    'Known as disjunctive union
    Dim NotMatches As IEnumerable(Of Integer) = id1.Except(id2).Union(id2.Except(id1))
    MessageBox.Show(Matches.Count.ToString)
    'TextBox1 and 2 .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

    For Each NotMatch In NotMatches
        TextBox2.Text &= NotMatch.ToString & Environment.NewLine
    Next
End Sub

析取性工会代码由@ØyvindBråthenThe opposite of Intersect()

提供

维基百科https://en.wikipedia.org/wiki/Set_theory的集合论

编辑

只是发现了HashSet(Of T)。该集合具有一个称为.SymetricExceptWith的方法,该方法将第一个HashSet更改为仅包含两个集合都不通用的元素。称为析取联合,或如文档所称的对称差异。一个警告,不能包含重复的元素。

    Dim hs1 As New HashSet(Of Integer) From {1, 3, 5, 11}
    Dim hs2 As New HashSet(Of Integer) From {2, 3, 6, 11}
    hs1.SymmetricExceptWith(hs2)
    For Each i As Integer In hs1
        Debug.Print(i.ToString)
    Next
    'result 1 6 5 2