查找两个列表中是否出现相同的值

时间:2018-11-15 20:16:53

标签: vb.net list duplicates

我有两个值几乎相同的列表。我想从第二个列表中删除具有相同用户名的每一行。

ListA                    ListB
Col1   Col2   Col3       Col1   Col2   Col3
1222   User1  2018       1111   User1  2019
1234   User2  2018       1456   User10 2018
2333   User3  2018       2345   User5  2018

我尝试这个:

listA = listB.Except(listA).toList

我要做的是在listA中删除User1所在的行。但是由于行不完全相同,我尝试的行不起作用。

到目前为止,我仅发现谁从两个列表中删除了完全相同的行。 我仍然在学习编码。我有一个模糊的想法,我需要循环进入两个列表,但是我被卡住了。任何帮助将不胜感激。

谢谢

3 个答案:

答案 0 :(得分:0)

您可以按以下方式使用ListViews:

PopupPickerRow

答案 1 :(得分:0)

怎么样?

Public Class Form1

    Private ListA As New List(Of Row)
    Private ListB As New List(Of Row)

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        ListA.Add(New Row(1222, "User1", 2018))
        ListA.Add(New Row(1234, "User2", 2018))
        ListA.Add(New Row(2333, "User3", 2018))

        ListB.Add(New Row(1111, "User1", 2019))
        ListB.Add(New Row(1456, "User10", 2018))
        ListB.Add(New Row(2345, "User5", 2018))

        ListB.ForEach(Function(b) ListA.RemoveAll(Function(a) a.Col2 = b.Col2))

        ' If you want to use a for each loop.
        'For Each b As Row In ListB
        '    For Each a As Row In ListA.ToArray
        '        If a.Col2 = b.Col2 Then
        '            ListA.Remove(a)
        '        End If
        '    Next
        'Next

    End Sub

End Class

Class Row

    Property Col1 As Integer
    Property Col2 As String
    Property Col3 As Integer

    Public Sub New(value1 As Integer, value2 As String, value3 As Integer)
        Col1 = value1
        Col2 = value2
        Col3 = value3
    End Sub

End Class

答案 2 :(得分:0)

您可能正在寻找使用IEqualityComparer Except(IEnumerable, IEnumerable, IEqualityComparer)的方法 简短的答案是

listA = listB.Except(listA, New MyComparer).toList

说明

我们有一个包含在列表中的类

Private Class TestClass
    Property Prop1 As String
    Property Prop2 As String
End Class

我们有两个列表

    Dim listA As New Generic.List(Of TestClass)
    Dim listB As New Generic.List(Of TestClass)

我们希望值几乎相同,例如Prop1相等而Prop2无关紧要。所以我们定义一个比较器

Private Class MyComparer
        Implements Generic.IEqualityComparer(Of TestClass)

        Public Function Equals1(x As TestClass, y As TestClass) As Boolean Implements IEqualityComparer(Of TestClass).Equals
            Return x.Prop1 = y.Prop1
        End Function

        Public Function GetHashCode1(obj As TestClass) As Integer Implements IEqualityComparer(Of TestClass).GetHashCode
            Return obj.Prop1.GetHashCode
        End Function
End Class

并使用比较器

Dim res = listB.Except(listA, New MyComparer)

注意

您必须注意哈希码。相等的对象必须始终具有相同的哈希。 当哈希不同的对象相同时,代码可以工作,但速度较慢。