Pourquoi ne puis-je récupérer un élément à partir d'un HashSet sans énumération?

Je suis à la recherche pour un aperçu de la têtes de HashSet concepteurs. Pour autant que je suis au courant, ma question s'applique à la fois à Java et C# HashSets, me faisant penser il doit y avoir une bonne raison pour cela, mais je ne peux pas penser à tout moi-même.

Après j'ai inséré un article dans un HashSet, pourquoi est-il impossible de récupérer cet élément sans énumération, à peine un fonctionnement efficace? Surtout depuis qu'un HashSet est explicitement construit d'une manière qui contribue à l'efficacité de la récupération.

Il serait souvent utile pour moi d'avoir Supprimer(x) et Contient(x) de retour de l'élément réel est en cours de suppression ou de contenus. Ce n'est pas nécessairement l'élément je passe à la Supprimer(x) ou Contient(x) de la fonction. Bien sûr, je suppose que je pourrais obtenir le même effet par le biais d'une table de hachage, mais pourquoi perdre tout ce que l'espace et de l'effort quand il doit être parfaitement possible de le faire avec un set?

Je peux comprendre qu'il peut y avoir certains problèmes de conception que l'ajout de cette fonctionnalité permet les utilisations de HashSet qui ne sont pas compatible avec leur rôle ou un rôle à l'avenir dans le cadre, mais si c'est le cas, quels sont ces problèmes de conception?

Modifier

De répondre à quelques questions, voici plus de détails:

Je suis en utilisant un immuable type de référence avec substituée hashcode, d'égal à égal, etc pour émuler un type de valeur dans C#. Disons que le type a des membres A, B, et C. Hashcode, d'égal à égal, etc dépendre uniquement de A et B. compte tenu de certains A et B je veux être en mesure de récupérer l'équivalent de l'élément à partir d'un hashset et c'est faire le C. je ne vais pas être en mesure d'utiliser HashSet pour cela, il s'affiche, mais je voudrais au moins savoir si il n'y a aucune bonne raison pour cela. Le Pseudo-code suivant:

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
  • "pourquoi est-il impossible de récupérer cet élément sans énumération" Pourriez-vous préciser ce que vous entendez ici, entendez-vous get(), contient() est O(n) dans votre cas?
  • Sûr 🙂 je voulais dire que je ne peut pas récupérer la référence exacte je l'ai mis dans le jeu sans que l'énumération. Il n'y a pas de get() de l'opérateur pour HashSet, et contient() prend un argument qui est sans doute évalue à égal à la référence que vous mettez, mais peut-être pas la référence exacte que vous mettez dans. J'espère que efface jusqu'à.
  • Dans ce cas, vous pouvez mettre en œuvre votre equals() de retour cette == obj - I. e. pour vérifier que la même référence. Sans la création d'un objet de contrôle, c'est un prix élevé à payer. Et la création d'un objet de contrôle serait peut résoudre le problème seul.
  • Il vous manque que le hachage n'est pas nécessairement unique. Il est juste et outil d'indexation.
  • C'est ajouté .NET au moins (v4.7.2).
InformationsquelleAutor sooniln | 2009-09-29