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

无法从具有Linq的另一个列表中排除包含的项目,linq,list,Linq,List,我有两个自定义类型列表“客户端”。我必须合并这两个列表,避免可能的重复。 我通过Linq尝试了IEnumerable.Except()方法和“NOT IN”语句,但返回的列表仍然包含其他列表中包含的元素: var dupes = getFirstList().ToList(); //List<Client> var search = getUsersList().Cast<Client>().ToList(); //List<Client> //The

我有两个自定义类型列表“客户端”。我必须合并这两个列表,避免可能的重复。
我通过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;
var dupes=getFirstList().ToList()//列表
var search=getUsersList().Cast().ToList()//列表
//返回的项目与原始重复列表中的项目相同
var unique=dupes.Except(search.ToList();
//即使我可以看到两个列表中都有相同的contactId,也不会返回任何记录
var u=在normalSearch中从k开始
哪里(来自重复的d)
选择d.联系人ID)
.包含(k.联系人ID)
选择k;
为什么我无法匹配这两个列表以删除重复项

编辑:


对于Exception方法,我想我必须实现接口IEquatable,以使其能够与自定义类型一起工作。但是在LINQ语句的情况下,我仍然无法理解为什么不返回任何记录,因为在这种情况下“ContactId”字段是int。

除非使用这种方法来检查引用是否相等,所以这些对象是否具有相同的
ContactId
或任何其他字段都无关紧要。(在您的代码中,您使用的是
normalSearch
变量,但没有定义该变量)

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

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

考虑到Linq声明,在这种情况下它应该可以工作。知道为什么不返回任何数据吗?这应该是一个正常的Linq列表查询。它可以工作,谢谢!我认为在Linq中,我可以“自动”迭代通过集合的项,而无需使用任何()方法。