HashSet不删除项目

CSh*_*pie 6 c# hashset

我不知道这里的问题是什么,

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

最终在我的代码中(没有多头)我想从hashset中删除项目

_itemsToProcess.Remove(item);
Run Code Online (Sandbox Code Playgroud)

这不起作用.我也试过了

_itemsToProcess.RemoveWhere(i=>i.Equals(item));
Run Code Online (Sandbox Code Playgroud)

嗯,它看起来微不足道,但我可以保证,项目在_itemsToProcess内.我通过调试检查了

_itemsToProcess.Any(item.Equals) // Returns true
_itemsToProcess.Contains(item)   // Returns false

item.GetHashcode() == _itemsToProcess.First().GetHashcode()  // returns true aswell.
Run Code Online (Sandbox Code Playgroud)

该项目没有实现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);
}
Run Code Online (Sandbox Code Playgroud)

所以重新解决问题

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

_itemsToProcess.Contains(item)  // false, why?
Run Code Online (Sandbox Code Playgroud)

CSh*_*pie 5

所以答案是:

当项目添加到Hashset时,GetHashcode返回不同​​的值.由于处理似乎改变了该方法中考虑的属性,因此gethashcode在结尾处返回了不同的值.

所以这解释了为什么甚至包含没有工作.

谢谢您的帮助.