【问题标题】:.NET: Why is this HashSet.Remove() not working?.NET:为什么这个 HashSet.Remove() 不起作用?
【发布时间】:2014-08-07 07:18:34
【问题描述】:

这是删除发生的循环:在每次迭代中,我检查 memSo 是否在 orgsToRemove 中,当它是时,我将它从 user.SecondaryOrgansations 中删除。然而,在调试器中检查这个集合,在 Remove() 之后它并没有改变。

user.SecondaryOrganisations 和 orgsToRemove 都是 HashSet。

foreach (var memSo in user.SecondaryOrganisations.ToList())
{
     if (orgsToRemove.Any(so => so.Id == memSo.Id))
         user.SecondaryOrganisations.Remove(memSo); //This line is hit, actually returns TRUE, but does nothing
}

这是Organization类中的Equals()和GetHashCode()

public override bool Equals(object obj)
{
    if (obj == null || GetType() != obj.GetType())
        return false;

    var p = (Organisation)obj;
        return (Id == p.Id); // This is hit when Remove is called and is TRUE
}

public override int GetHashCode()
{
    return Id.GetHashCode();
}

我就是想不通。

【问题讨论】:

  • 您是否明确检查了对 Remove 的调用的返回值?
  • Remove() 返回 true!
  • 你能发布一个重现上述问题的示例程序吗?
  • SecondaryOrganisations 背后的实现是什么? IE。如果它是一个总是创建一个新的HashSet(从某个地方填充它)的属性,那么这段代码没有(整体)影响也就不足为奇了。
  • Damien_The_Unbeliever 拥有它!我只是假设这是一个简单的属性……假设是所有错误的根源。随意张贴作为答案,我会标记它是正确的。

标签: .net hashset


【解决方案1】:

您可以尝试通过将 for 循环替换为:

user.SecondaryOrganizations.RemoveWhere(o=>orgsToRemove.Any(otr=>otr.Id == o.Id));

或者

user.SecondaryOrganizations.ExceptWith(orgsToRemove);

【讨论】:

  • 我试了第二个例子,结果是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2013-03-10
  • 1970-01-01
  • 2014-01-01
  • 2013-11-14
相关资源
最近更新 更多