为什么我无法在没有枚举的情况下从哈希集中检索项目?
我正在寻找对HashSet设计师的见解。据我所知,我的问题同时适用于Java和C#HashSets,这让我认为它一定有一些很好的理由,尽管我自己想不出任何理由。
将项目插入哈希集后,为什么在没有枚举的情况下无法检索该项目,这几乎不是一个有效的操作?特别是因为HashSet是以支持高效检索的方式显式构建的。
让 Remove(x) 和 Contains(x) 返回要删除或包含的实际项目通常很有用。这不一定是我传递到 Remove(x) 或 Contains(x) 函数中的项目。当然,我想我可以通过HashMap达到同样的效果,但是当用一套完全有可能做到这一点时,为什么要浪费所有的空间和精力呢?
我可以理解,可能会有一些设计问题,即添加此功能将允许使用与它们在框架中的角色或未来角色不一致的HashSet,但是如果是这样,这些设计问题是什么?
编辑
要回答更多问题,以下是更多详细信息:
我正在使用具有重写哈希码,equals等的不可变引用类型来模拟C#中的值类型。假设该类型具有成员 A、B 和 C.哈希码、等于等仅依赖于 A 和 B。给定一些A和B,我希望能够从哈希集中检索该等效项并得到它的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