我有一个用C#编写的ASP.Net Web应用程序,它有一个名为AffectedEmployees的List<Employee>
对象,其中Employee是我编写的类。受影响的员工也是我写的另一个名为LitHoldDetails的班级的财产,但我不认为这是相关的;我只是包含这些信息,以防我错了,当然,这从未发生过。 ;)无论如何,我需要从AffectedEmployees中删除一个特定的Employee对象。我首先做了Remove()
(Add()
作品,BTW),但有问题的员工没有从AffectedEmployees中删除。所以我通过拨打Contains()
来检查以确保它真的存在。 Contains()
在AffectedEmployees中找不到Employee,但如果我检查列表并将其与调试器中的Employee进行比较,那么Employee确实在受影响的Employees中。我用精细的牙齿梳子比较了两者,我发现数据没有区别。我究竟做错了什么?这是我的代码:
Employee emp = new Employee().FindByLogin(item.Key.ToString());
if (CurrentLitHoldDetails.AffectedEmployees.Contains(emp))
CurrentLitHoldDetails.AffectedEmployees.Remove(emp);
注意:FindByLogin()
启动emp并用数据填充它。 item.Key.ToString()
来自Hashtable,其中包含我需要删除的所有员工
答案 0 :(得分:4)
您正在创建一个新的Employee
对象,该对象在列表中可能不存在,然后尝试将其删除。因此,它找不到确切的对象(即使新Employee
对象的内容与列表中的其他Employee
对象匹配)并且不会将其删除。如果在其上放置Remove
的行上设置断点,您将看到它没有被击中。
尝试使用RemoveAll
删除符合某些条件的所有元素。 (我在这里做了一些猜测,因为我不知道你的课程究竟是什么样的。)
CurrentLitHoldDetails.AffectedEmployees.RemoveAll(x => x.Login == item.Key.ToString());
答案 1 :(得分:3)
Remove
和Contains
测试您要删除的确切对象是否存在,而不仅仅是具有相同数据的对象。因此,当您创建一个新的Employee
对象时,它正在寻找那个确切的对象。它找不到它,因为这个确切的对象从未被添加到AffectedEmployees
。
这称为“引用相等”,是默认行为。如果您希望Remove
和Contains
根据属性值确定相等性,则需要覆盖Equals
对象上的GetHashCode
和Employee
方法。 (有关Object.GetHashCode()
的Microsoft文档,请参阅here。)