Найти, если одно и то же значение появляется в двух списках - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть два списка с почти одинаковым значением. Я хочу удалить из второго списка каждую строку с тем же именем пользователя.

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

Что я хочу сделать - это удалить строку с User1 в списке A. Но поскольку строка не совсем совпадает, то, что я пытаюсь, не сработало.

Пока что я нашел только тех, кто удаляет одну и ту же строку из двух списков. Я все еще учусь кодировать. У меня есть смутное представление о том, что мне нужно попасть в оба списка, но я застрял. Любая помощь будет признательна.

Спасибо

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Как насчет этого?

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
0 голосов
/ 16 ноября 2018

Возможно, вы ищете IEqualityComparer Кроме (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)

Примечание

Вы должны быть осторожны с хеш-кодом. Равные объекты всегда должны иметь одинаковые хэши. Когда хеш-объект различен, код работает, но работает медленнее.

0 голосов
/ 16 ноября 2018

Вы можете использовать ListViews следующим образом:

Private Sub btnCompare_Click(sender As Object, e As EventArgs) Handles btnCompare.Click

    Dim rowToDel As Integer
    Dim x, y, maxx, maxy As Integer
    maxy = ListView2.Items.Count
    maxx = ListView1.Items.Count

    For x = 0 To maxx - 1 ' ListView1 Rows

        For y = 0 To maxy - 1 ' ListView2 Rows

            If y < maxy Then

                If ListView1.Items(x).SubItems(1).Text = ListView2.Items(y).SubItems(1).Text Then

                    rowToDel = y
                    ListView2.Items(y).Remove()
                    ListView2.Refresh()
                    maxy = maxy - 1 ' Reduce ListView2 Max row

                End If

            End If

        Next

    Next


End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' Adding ListView Columns
    ListView1.Columns.Add("Col1", 60, HorizontalAlignment.Left)
    ListView1.Columns.Add("Col2", 60, HorizontalAlignment.Left)
    ListView1.Columns.Add("Col3", 60, HorizontalAlignment.Left)

    ListView2.Columns.Add("Col1", 60, HorizontalAlignment.Left)
    ListView2.Columns.Add("Col2", 60, HorizontalAlignment.Left)
    ListView2.Columns.Add("Col3", 60, HorizontalAlignment.Left)

    Dim str(3) As String
    Dim itm As ListViewItem

    str(0) = "1111"
    str(1) = "User1"
    str(2) = "2017"
    itm = New ListViewItem(str)
    ListView1.Items.Add(itm)

    str(0) = "1113"
    str(1) = "User2"
    str(2) = "2017"
    itm = New ListViewItem(str)
    ListView1.Items.Add(itm)

    str(0) = "1114"
    str(1) = "User3"
    str(2) = "2018"
    itm = New ListViewItem(str)
    ListView1.Items.Add(itm)

    str(0) = "2211"
    str(1) = "User3"
    str(2) = "2019"
    itm = New ListViewItem(str)
    ListView2.Items.Add(itm)

    str(0) = "2222"
    str(1) = "User4"
    str(2) = "2019"
    itm = New ListViewItem(str)
    ListView2.Items.Add(itm)

    str(0) = "2223"
    str(1) = "User1"
    str(2) = "2019"
    itm = New ListViewItem(str)
    ListView2.Items.Add(itm)


End Sub
...