为什么我无法在没有枚举的情况下从HashSet中检索项?

24 浏览
0 Comments

为什么我无法在没有枚举的情况下从HashSet中检索项?

我正在寻求HashSet设计者的洞察力。据我所知,我的问题适用于Java和C#的HashSet,这让我认为一定有一些很好的理由,尽管我自己想不出任何理由。

在我将一个项目插入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)); //返回true,但我无法检索到extra

0