【问题标题】:list Remove method does not remove list itemlist Remove 方法不会删除列表项
【发布时间】:2014-01-08 18:02:44
【问题描述】:

我有一个用 C# 编写的 ASP.Net Web 应用程序,它有一个名为 AffectedEmployees 的 List<Employee> 对象,其中 Employee 是我编写的一个类。 AffectedEmployees 也是我编写的另一个名为 LitHoldDetails 的类的属性,但我认为这无关紧要。我只是将信息包括在内,以防我错了,当然,这从未发生过。 ;) 无论如何,我需要从 AffectedEmployees 中删除一个特定的 Employee 对象。我首先只是做了一个Remove()Add() 工作,顺便说一句),但有问题的员工没有从 AffectedEmployees 中删除。所以我打电话给Contains(),确认它确实在那里。 Contains() 没有在 AffectedEmployees 中找到 Employee,但是如果我检查该列表并将其与调试器中的 Employee 进行比较,则该 Employee 确实在 AffectedEmployees 中。我用细齿梳将两者进行了比较,我发现数据没有差异。我究竟做错了什么?这是我的代码:

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

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

【问题讨论】:

    标签: c# asp.net list


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗯,这就解释了。很简单。非常感谢!
    【解决方案2】:

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

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

    【讨论】:

    • 安,你的答案很完美,我赞成,但我将格兰特的答案标记为答案,因为他对 RemoveAll() 的建议比覆盖 Equals 和 GetHashCode 要简单得多。不过,还是非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多