VB.NET - List.Contains 在应该为真时总是 returns 为假

VB.NET - List.Contains always returns false when it should be true

我更像是一名 C# 开发人员,我坚持尝试在我的 visual basic 代码上实现一些东西; TL;DR 是我有一个数据库 table,其中包含所有已完成流程的员工 ID。我希望能够将它们放入一个列表中,看看是否有任何正在经历此过程的当前成员存在于此列表中,如果他们确实删除了这些成员,那么他们就不会被重新处理。数据库 table return 是一个名为“ProcessedTermedMember”类型的对象,它是一个具有三个字符串属性(ID、名字、姓氏)的自定义对象

我这里基本上有这段代码,它是 returning false...我知道它希望看到 Reference 默认情况下与 contains 相等,所以只有当它是完全相同的对象,VS 所有属性都相同的对象。我该如何覆盖它?

这是我的代码:

            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' 语句总是 returns "false" 如果 "term" 变量中的所有属性都等于“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 语句所做的是从 db.ECs 中提取记录,其中 AccountTypeCode 不是“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()