Получить эквивалентный объект из HashSet в O(1)

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# интернирует строки: равные объекты нуждаются только в одном экземпляре. Таким образом, я могу добавить метаданные к такому объекту и быть уверенным, что нигде нет другого эквивалентного экземпляра без этих метаданных.

8
задан Community 23 May 2017 в 12:21
поделиться