C# 列表移除方法不移除列表项

C# 列表移除方法不移除列表项,c#,asp.net,list,C#,Asp.net,List,我有一个用C#编写的ASP.Net web应用程序,它有一个名为AffectedEmployees的列表对象,其中Employee是我编写的一个类。AffectedEmployees也是我写的另一个叫做LitHoldDetails的类的一个属性,但我认为这并不相关;我只是把信息包括在内,以防我错了,当然,这从来没有发生过无论如何,我需要从受影响的员工中删除一个特定的员工对象。我刚开始做了一个Remove()(Add()works,顺便说一句),但相关员工并未从受影响的员工中删除。因此,我通过调用

我有一个用C#编写的ASP.Net web应用程序,它有一个名为AffectedEmployees的
列表
对象,其中Employee是我编写的一个类。AffectedEmployees也是我写的另一个叫做LitHoldDetails的类的一个属性,但我认为这并不相关;我只是把信息包括在内,以防我错了,当然,这从来没有发生过无论如何,我需要从受影响的员工中删除一个特定的员工对象。我刚开始做了一个
Remove()
Add()
works,顺便说一句),但相关员工并未从受影响的员工中删除。因此,我通过调用
Contains()
来检查它是否确实存在
Contains()
在AffectedEmployees中找不到该员工,但如果我检查该列表并将其与调试器中的员工进行比较,则该员工确实在AffectedEmployees中。我用细梳子比较了两者,我看不出数据有什么不同。我做错了什么?这是我的密码:

Employee emp = new Employee().FindByLogin(item.Key.ToString());
if (CurrentLitHoldDetails.AffectedEmployees.Contains(emp))
    CurrentLitHoldDetails.AffectedEmployees.Remove(emp);

注意:
FindByLogin()
启动emp并用数据填充它
item.Key.ToString()
来自一个哈希表,该哈希表包含我需要删除的所有员工

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

尝试使用
RemoveAll
删除与某些条件匹配的所有元素。(我在这里做一些猜测,因为我不知道你的类到底是什么样子。)


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

尝试使用
RemoveAll
删除与某些条件匹配的所有元素。(我在这里做一些猜测,因为我不知道你的类到底是什么样子。)


Remove
包含
测试要删除的对象是否存在,而不仅仅是数据相同的对象。因此,当您创建一个新的
Employee
对象时,它会查找确切的对象。它找不到它,因为该确切对象从未添加到受影响的员工中


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

删除
,并且
包含测试您试图删除的确切对象是否存在,而不仅仅是数据相同的对象。因此,当您创建一个新的
Employee
对象时,它会查找确切的对象。它找不到它,因为该确切对象从未添加到受影响的员工中


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

好的,这就解释了它。这么简单。非常感谢你!这就解释了。这么简单。非常感谢你!Ann,你的答案很完美,我投了更高的票,但我把Grant的答案标记为RemoveAll(),因为他的RemoveAll()建议比覆盖Equals和GetHashCode简单得多。不过,非常感谢!Ann,你的答案很完美,我投了更高的票,但我把Grant的答案标记为RemoveAll(),因为他的RemoveAll()建议比覆盖Equals和GetHashCode简单得多。不过,非常感谢!
CurrentLitHoldDetails.AffectedEmployees.RemoveAll(x => x.Login == item.Key.ToString());