VB.NET-列表.Contains在应该为true时总是返回false



我更像是一名C#开发人员,我一直在尝试在我的visual basic代码上实现一些东西;TL;DR是我有一个数据库表,其中包含经过流程的所有员工的ID。我希望能够将这些成员添加到列表中,并查看该列表中是否存在正在进行此过程的当前成员,以及他们是否删除了这些成员,从而不会对其进行重新处理。数据库表返回一个被称为"类型的对象;ProcessedTermedMember";它是一个具有三个字符串属性(ID、FirstName、LastName(的自定义对象

我这里基本上有这个代码,它返回false。。。我知道它希望看到引用在默认情况下与包含相等,所以只有当它是完全相同的对象时,与所有属性都相同的对象相比,它才会是真的。我如何才能覆盖此项?

这是我的代码:

Dim termedMembers = (From ec In db.ECs
Where ec.AccountTypeCode = "WCS"
Where ec.AccountStatus = 5
Select ec).ToList()
Dim processedTermMembers = (From p In db.ProcessedTermedMembers
Select p).ToList()
For Each member In termedMembers
Dim term As ProcessedTermedMember = New ProcessedTermedMember With {.EmployeeID = member.EmployeeID, .FirstName = member.EmployeeFirstName, .LastName = member.EmployeeLastName}
If processedTermMembers.Contains(term) Then
termedMembers.Remove(member)
End If
Next

循环中的这个"If Then"语句总是返回"If";false";如果"中的所有属性都为true;术语";变量等于"0"中列表项之一的属性;processedTermMembers";?

如有任何帮助,我们将不胜感激。

这不起作用有两个原因,即因为您试图在for/Each循环中修改集合。

最简单的解决方案是将termedMembers的声明移到processedTermMembers的声明之后,并在termedMembers:中添加一个额外的where子句

Dim processedTermMembers = (From p In db.ProcessedTermedMembers
Select p).ToList()
Dim termedMembers = (From ec In db.ECs
Where ec.AccountTypeCode = "WCS" AndAlso ec.AccountStatus = 5 AndAlso Not processedTermMembers.Any(Function(term) term.EmployeeID = ec.EmployeeID AndAlso term.FirstName = ec.EmployeeFirstName AndAlso term.LastName = ec.EmployeeLastName)).ToList()

修改后的LINQ语句所做的是从CCD_ 4拉入记录;WCS";,AccountStatus不是5,并且不在processedTermMembers集合中。

只是对@David代码进行了一些修改:

Dim processedTermMembers = (From p In db.ProcessedTermedMembers
Select p).ToList()
Dim termedMembers = (From ec In db.ECs
Where (ec.AccountTypeCode = "WCS" _
AndAlso ec.AccountStatus = 5 _
AndAlso Not (processedTermMembers.Any(Function(term) ec.EmployeeID.Equals(term.EmployeeID) AndAlso ec.EmployeeFirstName.Equals(term.FirstName) AndAlso ec.EmployeeLastName.Equals(term.LastName))))).ToList()

最新更新