list删除方法不会删除列表项

时间:2014-01-08 18:02:44

标签: c# asp.net list

我有一个用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,其中包含我需要删除的所有员工

2 个答案:

答案 0 :(得分:4)

您正在创建一个新的Employee对象,该对象在列表中可能不存在,然后尝试将其删除。因此,它找不到确切的对象(即使新Employee对象的内容与列表中的其他Employee对象匹配)并且不会将其删除。如果在其上放置Remove的行上设置断点,您将看到它没有被击中。

尝试使用RemoveAll删除符合某些条件的所有元素。 (我在这里做了一些猜测,因为我不知道你的课程究竟是什么样的。)

CurrentLitHoldDetails.AffectedEmployees.RemoveAll(x => x.Login == item.Key.ToString());

答案 1 :(得分:3)

RemoveContains测试您要删除的确切对象是否存在,而不仅仅是具有相同数据的对象。因此,当您创建一个新的Employee对象时,它正在寻找那个确切的对象。它找不到它,因为这个确切的对象从未被添加到AffectedEmployees

这称为“引用相等”,是默认行为。如果您希望RemoveContains根据属性值确定相等性,则需要覆盖Equals对象上的GetHashCodeEmployee方法。 (有关Object.GetHashCode()的Microsoft文档,请参阅here。)