奇怪的是,这还没有更多。
短版
ListA有一些ListB有的元素,有些则没有。 ListB有一些ListA有的元素,有些则没有。 ......事实上,绝大多数都是愚蠢的。
注意:这些元素不是常见的类型,而是来自我制作的类......(LINQ Intersect似乎只适用于已知类型 - 请参阅下面的更新)
如何删除共享中两个列表中的条目?
长版
- 设备上有ListA项目,我想将它与ListB的项目同步。我不想删除&造新。这不是一个可能的选择。
- 要同步列表,我会:
第一
(?)删除它们之间的任何欺骗(这些条目已经同步' d, 毕竟)。
第二:(轻松)删除剩余的任何ListA条目(因为它们不是 在ListB上,否则它们将作为欺骗被删除)。
第三:(简单)向ListA添加列表B上剩余的任何条目(列表我们 需要最终得到ListA)。
讨论
现在是的,我可以简单地手动迭代每个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))
答案 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))中解决这个问题。