我不知道这里的问题是什么,
我有一个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)
所以答案是:
当项目添加到Hashset时,GetHashcode返回不同的值.由于处理似乎改变了该方法中考虑的属性,因此gethashcode在结尾处返回了不同的值.
所以这解释了为什么甚至包含没有工作.
谢谢您的帮助.