如何删除两个列表共有的重复(用户定义的类)条目?

时间:2014-06-16 00:27:22

标签: vb.net linq list

奇怪的是,这还没有更多。

短版

ListA有一些ListB有的元素,有些则没有。 ListB有一些ListA有的元素,有些则没有。 ......事实上,绝大多数都是愚蠢的。

注意:这些元素不是常见的类型,而是来自我制作的类......(LINQ Intersect似乎只适用于已知类型 - 请参阅下面的更新)

如何删除共享两个列表中的条目?

长版

- 设备上有ListA项目,我想将它与ListB的项目同步。我不想删除&造新。这不是一个可能的选择。

- 要同步列表,我会:

第一

  1. (?)删除它们之间的任何欺骗(这些条目已经同步' d, 毕竟)。

  2. 第二:(轻松)删除剩余的任何ListA条目(因为它们不是 在ListB上,否则它们将作为欺骗被删除)。

  3. 第三:(简单)向ListA添加列表B上剩余的任何条目(列表我们 需要最终得到ListA)。

  4. 讨论

    现在是的,我可以简单地手动迭代每个List,但问题更多的是优雅与性能。联盟只是应用了一种“不同”的联盟。离开愚蠢的行动。

    使用VB和/或LINQ,但可以转换为C#...

    UPDATE - LINQ Intersect不喜欢自定义/用户类型(类):

    List1: ip: 85.94.160.0 net: 255.255.224.0 hash: 35462368
    List1: ip: 91.187.64.0 net: 255.255.224.0 hash: 15720800
    List1: ip: 109.111.96.0 net: 255.255.224.0 hash: 27477092
    List1: ip: 185.4.52.0 net: 255.255.252.0 hash: 19444704
    List1: ip: 194.158.64.0 net: 255.255.224.0 hash: 65489923
    
    List2: ip: 85.94.160.0 net: 255.255.224.0 hash: 45276315
    List2: ip: 91.187.64.0 net: 255.255.224.0 hash: 10391797
    List2: ip: 109.111.96.0 net: 255.255.224.0 hash: 29919882
    List2: ip: 185.4.52.0 net: 255.255.252.0 hash: 13173532
    List2: ip: 194.158.64.0 net: 255.255.224.0 hash: 65387957
    

    (hash表示每个实例的.GetHashCode()输出)

    我可以覆盖 LINQ的Intersect正在使用的比较器功能吗?我没有在网上找到关于LINQ的Intersect功能(它用来判断'平等')的内容......


    对于VB.NET人员:

    这是user2321864的解决方案,但在VB.NET中:

    Dim a = New List(Of Integer) From {2, 4, 6, 8}
    Dim b = New List(Of Integer) From {1, 2, 3, 5, 7}
    
    'find items common in both lists
    Dim dupes = a.Intersect(b).ToList()
    
    'delete common items from both lists
    a.RemoveAll(Function(x) dupes.Contains(x))
    b.RemoveAll(Function(x) dupes.Contains(x))
    

3 个答案:

答案 0 :(得分:2)

LINQ Intersect将为您提供两个列表中的公共条目

var a = new List<int>{2,4,6,8};
var b = new List<int>{1,2,3,5,7};

//find items common in both lists
var dupes = a.Intersect(b).ToList();

//delete common items from both lists
a.RemoveAll(x => dupes.Contains(x));
b.RemoveAll(x => dupes.Contains(x));

答案 1 :(得分:1)

这最终成为了诀窍的最终版本。我只是简要介绍了IP&amp;用于散列的子网因此始终存在一致的方式。只要将要使用的元素组合在一起使用的方式与使用时保持一致,就可以使用任何东西作为等式哈希输入。

最重要的是.GetHashCode和.Equals是相关的。这一点是在SO上的其他帖子中提出的。对于这个程序员来说,我们可以覆盖这些函数以适应我们的自定义对象,这是一件很棒的事情!

可以修改VB中的任何自定义类型...

谢谢大家!

Public Class NetworkEntry
    [...]
    '
    ' override base functions for proper .Equals(x) operation
    '
    Public Overrides Function GetHashCode() As Integer
        Dim concat As String = Me.HostAddress.ToString & Me.SubnetAddress.ToString
        Return concat.GetHashCode
    End Function
    '
    Public Overloads Function Equals(obj As NetworkObject) As Boolean
        Dim equal As Boolean = False
        If (Me.HostAddress.ToString = obj.HostAddress.ToString) And
            (Me.SubnetAddress.ToString = obj.SubnetAddress.ToString) Then
                equal = True
        End If
        Return equal
    End Function
    [...]
End Class

感谢大家的投入!

答案 2 :(得分:-1)

对两个列表进行排序(取O [n log n] + O [m log m])后,只需迭代两个列表就可以在O(max(n,m))中解决这个问题。