奇怪的是这方面的内容不多。
简短版:
ListA有一些ListB也有的元素,而有一些元素则不同。 ListB有一些ListA也有的元素,而有一些元素则不同。实际上,其中绝大部分都是重复的。
注意:这些元素并不是常见类型,而是我自己创建的一个类的类型。(LINQ Intersect似乎只能用于已知类型-请参见下面的更新)
如何删除它们共同拥有的元素?
详细版:
-某个设备上有ListA项目,我想将其与ListB项目同步。我不想删除和新建。那不是一个可行的选择。
-为了同步这些列表,我会:
首先:
(哈希是每个实例的.GetHashCode()的输出)
我能否覆盖LINQ的Intersect正在使用的比较器函数? 我在网上没有找到太多关于LINQ的Intersect函数如何运作(它用于判断“相等性”)...
简短版:
ListA有一些ListB也有的元素,而有一些元素则不同。 ListB有一些ListA也有的元素,而有一些元素则不同。实际上,其中绝大部分都是重复的。
注意:这些元素并不是常见类型,而是我自己创建的一个类的类型。(LINQ Intersect似乎只能用于已知类型-请参见下面的更新)
如何删除它们共同拥有的元素?
详细版:
-某个设备上有ListA项目,我想将其与ListB项目同步。我不想删除和新建。那不是一个可行的选择。
-为了同步这些列表,我会:
首先:
(?)删除它们之间的任何重复项(毕竟这些条目已经同步了)。
第二:(简单)删除剩余的ListA条目(因为它们不在ListB上,否则它们将被视为重复项而被删除)。
第三:(简单)将ListB上留下的任何条目添加到ListA中(我们需要最终在ListA上得到的列表)。
讨论
现在,是的,我可以手动遍历每个列表,但问题更多地涉及优雅和性能。Union仅应用一种“不同”的操作,使重复项保留下来。
使用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))