【发布时间】:2014-06-16 00:27:21
【问题描述】:
奇怪的是没有更多关于这个。
短版
ListA 有一些 ListB 有的元素,有一些没有。 ListB 有一些 ListA 有的元素,有些没有。 ...事实上,绝大多数都是骗子。
注意:这些元素不是常见类型,而是来自我创建的一个类...(LINQ Intersect 似乎只适用于已知类型 - 请参阅下面的更新)
如何删除两个列表中它们共有的条目?
加长版
-A 设备上有 ListA 项目,我想将它与 ListB 的项目同步。我不想删除并制作新的。这不是一个可能的选择。
-要同步列表,我会:
第一:
(?) 删除它们之间的任何重复(这些条目已经同步, 毕竟)。
second:(简单)删除任何剩余的 ListA 条目(因为它们不是 在 ListB 上,否则它们会被当作骗子删除)。
第三个:(简单)将 ListB 上剩余的任何条目添加到 ListA(我们的 List 需要以 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
(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))
【问题讨论】:
-
您需要做的就是覆盖 Equals 和 GetHashCode,您可以根据属性值验证它们是否被视为相等。您还可以为您的 POCO 创建一个 IEqualityComparer 的实现,您可以使用它。