【问题标题】:HashSet not removing an itemHashSet 不删除项目
【发布时间】:2014-02-21 16:24:00
【问题描述】:

我不确定这里的问题是什么,

我有一个名为 _itemsToProcess 的 HashSet<object>

最终在我的代码中(没有多标题)我想从哈希集中删除项目

_itemsToProcess.Remove(item);

这不起作用。 我也试过了

_itemsToProcess.RemoveWhere(i=>i.Equals(item));

嗯,它看起来微不足道,但我可以保证,项目在 _itemsToProcess 中。 我通过

签入调试
_itemsToProcess.Any(item.Equals) // Returns true
_itemsToProcess.Contains(item)   // Returns false

item.GetHashcode() == _itemsToProcess.First().GetHashcode()  // returns true aswell.

该项目没有实现 ICompareable 或 IEquatable 所以我在这里没有想法。

示例(简化了很多,因为这是一件大事)

readonly _itemsToProcess = new HashSet<object>();

void getItems()
{
    foreach(object o in getObjects())
         if(meetsCriteria(o)) _itemsToProcess.Add(o);

}



void processItems()
{
   if(_itemsToProcess.Count> 0)
   { 
      foreach(object item in _itemsToProcess.Where(criteria).ToArray())
          processItem(item);
   }
}

// This gets called in different ways
void processItem(object item)
{ 
     ... do stuff
     if(succes)
         _itemsToProcess.Remove(item);
}

重新表述问题

var compare = _itemsToProcess.First();
compare.GetHashcode() == item.GerHashcode() // true
compare.Equals(item) // true

_itemsToProcess.Contains(item)  // false, why?

【问题讨论】:

  • 如果您的 GetHashCode()Equals() 方法被破坏,就会发生这种情况
  • 是否实现IEquatable
  • 此时,重现该错误的最小示例将有所帮助:)。
  • 该代码实际上是您正在编写的代码,还是为了简洁而省略了您的 LINQ 表达式?
  • 查看这里了解更多关于这些东西应该如何工作的信息:stackoverflow.com/questions/371328/…

标签: c# hashset


【解决方案1】:

所以答案是:

当项目被添加到 Hashset 时,GetHashcode 返回一个不同的值。 由于处理似乎改变了该方法中考虑的属性,因此 gethashcode 最后返回了不同的值。

所以这就解释了为什么 even contains 不起作用。

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多