我正在寻找对 HashSet 设计者负责人的深入了解。据我所知,我的问题同时适用于 Java 和 C# HashSet,这让我认为这一定有一些充分的理由,尽管我自己也想不出任何理由。
在我将一个项目插入 HashSet 之后,为什么没有枚举就无法检索该项目,这几乎不是一个有效的操作?特别是因为 HashSet 是以一种支持有效检索的方式显式构建的。
让 Remove(x) 和 Contains(x) 返回被删除或包含的实际项目通常对我很有用。这不一定是我传递给 Remove(x) 或 Contains(x) 函数的项目。当然,我想我可以通过 HashMap 实现相同的效果,但是当完全可以使用集合来实现这一点时,为什么还要浪费所有的空间和精力呢?
我可以理解可能存在一些设计问题,即添加此功能将允许使用与其在框架中的角色或未来角色不一致的 HashSet,但如果是这样,这些设计问题是什么?
编辑
要回答更多问题,以下是更多详细信息:
我正在使用具有覆盖哈希码、等号等的不可变引用类型来模拟 C# 中的值类型。假设该类型具有成员 A、B 和 C。Hashcode、equals 等仅依赖于 A 和 B。假设某些 A 和 BI 希望能够从哈希集中检索该等价项并获得它是 C。我会的似乎无法为此使用 HashSet,但我至少想知道是否有任何充分的理由。伪代码如下:
public sealed class X{
object A;
object B;
object extra;
public int HashCode(){
return A.hashCode() + B.hashCode();
}
public bool Equals(X obj){
return obj.A == A && obj.B == B;
}
}
hashset.insert(new X(1,2, extra1));
hashset.contains(new X(1,2)); //returns true, but I can't retrieve extra