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