奇怪的是没有更多的东西了。
简洁版本
ListA具有ListB具有的某些元素,有些则没有。ListB具有ListA具有的某些元素,有些则没有。...实际上,绝大多数是骗子。
注意:元素不是常见的类型,而是从我编写的类中获取的(LINQ Intersect似乎仅适用于已知类型,请参见下面的更新)
如何删除两个列表中它们共有的条目?
长版
-设备上具有ListA项目,我想将其与ListB的项目同步。我不想删除并新建。那是不可能的选择。
-要同步列表,我将:
第一:
(?)删除它们之间的所有重复项(毕竟这些条目已经同步)。
第二:(轻松)删除所有剩余的ListA条目(因为它们不在ListB上,否则将被删除为重复对象)。
第三:(简单)将ListB上剩下的所有条目添加到ListA(我们需要以ListA结尾的List)。
讨论区
现在是的,我可以简单地手动遍历每个列表,但是问题更多与优雅和性能有关。联合会只是运用了一种“独特”的操作,使骗局成为可能。
使用VB和/或LINQ,但可以从C#转换...
更新-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
(哈希表示每个实例的.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))
最终成为可以解决问题的最终版本。我只是将IP和子网连接为散列,所以总会有一种一致的方式。只要您以相同的用法来组合要用于相等性的元素,就可以使用任何东西作为相等性哈希输入。
最大的收获是.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
感谢大家的投入!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句