Я ищу информацию о руководителях дизайнеров HashSet. Насколько мне известно, мой вопрос относится как к Java, так и к С# HashSets, заставляя меня думать, что для этого должна быть какая-то веская причина, хотя я и не могу думать о себе.
После того, как я вставил элемент в HashSet, почему невозможно получить этот элемент без перечисления, вряд ли эффективная операция? Тем более, что HashSet явно построен таким образом, который поддерживает эффективное извлечение.
Мне было бы полезно иметь Remove (x) и Contains (x) возвращать фактический элемент, который удаляется или содержится. Это не обязательно элемент, который я передаю в функцию Remove (x) или Contains (x). Конечно, я думаю, что я мог бы добиться такого же эффекта через HashMap, но зачем тратить все это пространство и усилия, когда это вполне возможно сделать с помощью набора?
Я могу оценить, что могут быть некоторые проблемы с дизайном, что добавление этой функции позволит использовать HashSet, которые не согласуются с их ролью или будущей ролью в структуре, но если это так, то каковы эти проблемы дизайна?
Edit
Чтобы ответить на еще несколько вопросов, более подробная информация:
Я использую неизменяемый ссылочный тип с переопределенным hashcode, equals и т.д., чтобы эмулировать тип значения в С#. Пусть говорят, что тип имеет члены A, B и C. Hashcode, equals и т.д. Зависят только от A и B. Учитывая, что некоторые A и BI хотят получить этот эквивалентный элемент из hashset и получить его 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