HashSet 設計者の頭の中への洞察を探しています。私が知る限り、私の質問は Java と C# HashSets の両方に当てはまるので、自分では考えられませんが、それには正当な理由があるに違いないと思います。
項目を HashSet に挿入した後、その項目を列挙せずに取得することが不可能であり、ほとんど効率的な操作ではないのはなぜですか? 特に、HashSet は効率的な検索をサポートする方法で明示的に構築されているためです。
Remove(x) と Contains(x) が、削除または含まれている実際のアイテムを返すようにすると便利なことがよくあります。これは、必ずしも Remove(x) または Contains(x) 関数に渡す項目ではありません。確かに、HashMap を使用して同じ効果を達成できると思いますが、セットでこれを完全に実行できるはずなのに、なぜそのすべてのスペースと労力を無駄にするのでしょうか?
この機能を追加すると、フレームワークでの役割または将来の役割と一致しない HashSet の使用が可能になるという設計上の懸念があることは理解できますが、そうである場合、これらの設計上の懸念は何ですか?
編集
さらにいくつかの質問に答えるために、詳細を以下に示します。
C# で値の型をエミュレートするために、オーバーライドされたハッシュコード、equals などで不変の参照型を使用しています。型にメンバー A、B、および C があるとします。ハッシュコード、equals などは A と B のみに依存します。A と BI がハッシュセットから同等の項目を取得して 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