在我将项目插入HashSet之后,为什么无法在没有枚举的情况下检索该项目,这几乎是一种低效的操作?特别是因为HashSet明确以支持高效检索的方式构建。
对我来说,Remove(x)和Contains(x)返回实际被删除或包含的项通常会很有用。这不一定是我传递给Remove(x)或Contains(x)函数的项。当然,我猜我可以通过HashMap实现相同的效果,但为什么要浪费所有那些空间和精力,当使用一个集合应该完全可以做到这一点?
我可以理解,可能存在一些设计上的问题,添加此功能将允许HashSet的用途与其在框架中的角色或未来角色不一致,但如果是这样,这些设计问题是什么?
编辑
为了回答更多问题,以下是更多细节:
我正在使用一个不可变的引用类型,并重写了哈希码、等于等方法,以在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