Warum kann ich ein Element nicht ohne Aufzählung aus einem HashSet abrufen?

Ich suche Einblick in die Köpfe der HashSet-Designer. Soweit mir bekannt ist, gilt meine Frage sowohl für Java als auch für C # -HashSets, was mich zu der Annahme veranlasst, dass es einen guten Grund dafür gibt, obwohl mir keiner einfällt.

Warum ist es nicht möglich, ein Element ohne Aufzählung abzurufen, nachdem ich es in ein HashSet eingefügt habe, kaum eine effiziente Operation? Zumal ein HashSet explizit so aufgebaut ist, dass ein effizienter Abruf möglich ist.

Für mich ist es oft nützlich, wenn Remove (x) und Contains (x) das tatsächlich entfernte oder enthaltene Element zurückgeben. Dies ist nicht unbedingt das Element, das ich in die Funktion Entfernen (x) oder Enthält (x) übergebe. Sicher, ich denke, ich könnte den gleichen Effekt durch eine HashMap erzielen, aber warum all den Platz und Aufwand verschwenden, wenn dies mit einem Set problemlos möglich sein sollte?

Ich kann verstehen, dass es einige Designprobleme geben kann, die das Hinzufügen dieser Funktionalität die Verwendung von HashSet ermöglichen, die nicht mit ihrer Rolle oder zukünftigen Rolle im Framework übereinstimmen. Aber wenn dies so ist, welche Designprobleme gibt es dann?

Bearbeiten

Um weitere Fragen zu beantworten, folgen hier weitere Details:

Ich verwende einen unveränderlichen Referenztyp mit überschriebenem Hashcode, Gleichheit usw., um einen Werttyp in C # zu emulieren. Nehmen wir an, der Typ hat die Mitglieder A, B und C. Hashcode, gleich, usw. hängen nur von A und B ab. Gegeben, einige A und BI möchten in der Lage sein, das entsprechende Element aus einem Hashset abzurufen und es zu erhalten. Ich habe gewonnen. ' Ich kann HashSet anscheinend nicht verwenden, aber ich würde gerne wissen, ob es dafür einen guten Grund gibt. Pseudocode folgt:

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

Antworten auf die Frage(12)

Ihre Antwort auf die Frage