无法从列表中排除包含在Linq的另一个列表中的项目

时间:2011-08-10 09:10:11

标签: linq list

我有两个自定义类型列表“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。

2 个答案:

答案 0 :(得分:1)

除了使用这种方式是检查引用相等性,因此这些对象是否具有相同的ContactId或任何其他字段无关紧要。 (在您的代码中,您使用的是normalSearch变量,但它没有定义的地方)

答案 1 :(得分:1)

对于linq部分(与Except相比速度较慢),您可以尝试一些

    from k in search
    where !dupes.Any(d => d.ContactId == k.ContactId)
    select k;