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()
我更像是一名 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()