A HashSet
может определить в O (1) содержит ли он определенный элемент. Если я переопределю Equals()
и GetHashCode()
в своем пользовательском классе, у меня может быть объект A и другой объект A', которые неравны по идентичности но для которых Equals()
возвращает true
и GetHashCode()
возвращает один и тот же хэш-код.
Теперь, учитывая, что A находится в хеш-наборе, я хочу получить A в O(1) при заданном A' (который равен A с точки зрения хэш-набора).
var a = new MyClass("A");
var a_prime = new MyClass("A");
Debug.Assert(a.Equals(a_prime));
Debug.Assert(a.GetHashCode() == a_prime.GetHashCode());
var set = new HashSet();
set.Add(a);
Debug.Assert(set.Contains(a_prime));
// This:
var retrieved_a = set.Get(a_prime);
Как это сделать?
(Обратите внимание, что этоне имеет ответа, который я ищу, и этовообще не имеет ответов.)
Немного справочной информации: я хочу использовать установить в internмои собственные объекты так же, как C# интернирует строки: равные объекты нуждаются только в одном экземпляре. Таким образом, я могу добавить метаданные к такому объекту и быть уверенным, что нигде нет другого эквивалентного экземпляра без этих метаданных.