我有两个自定义类型列表“Client”。我必须合并两个列表,避免可能的重复。
我通过Linq尝试了IEnumerable.Except()方法和“NOT IN”语句,但返回的列表仍然包含在另一个列表中的元素:
var dupes = getFirstList().ToList(); //List<Client>
var search = getUsersList().Cast<Client>().ToList(); //List<Client>
//The returned items are the same as in original dupes list
var unique = dupes.Except(search).ToList();
//No records are returned, even if debugging I can see that same contactId is in both lists
var u = from k in normalSearch
where !(from d in dupes
select d.ContactId)
.Contains(k.ContactId)
select k;
为什么我无法匹配这两个列表以删除重复项?
修改
对于Except方法,我想我必须实现接口IEquatable以使其适用于自定义类型。但是在LINQ语句的情况下,我仍然无法理解为什么没有返回记录,因为在这种情况下“ContactId”字段是一个int。
答案 0 :(得分:1)
除了使用这种方式是检查引用相等性,因此这些对象是否具有相同的ContactId
或任何其他字段无关紧要。 (在您的代码中,您使用的是normalSearch
变量,但它没有定义的地方)
答案 1 :(得分:1)
对于linq部分(与Except相比速度较慢),您可以尝试一些
from k in search
where !dupes.Any(d => d.ContactId == k.ContactId)
select k;