【发布时间】: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/…