IEqualityComparer по умолчанию для TDictionary <TObject, TObject>? - PullRequest
2 голосов
/ 15 марта 2011

Я только что прочитал

"Любой класс, который реализует Интерфейс IEqualityComparer ожидается, чтобы обеспечить реализацию для метода равно . "- ( Delphi DocWiki )

и

"Любой класс, который реализует Интерфейс IEqualityComparer ожидается, чтобы обеспечить реализацию для метода GetHashCode . "- ( Delphi DocWiki )

Как будет производительность TDictionary, если я создам TDictionary<TObject, TObject> и не реализую IEqualityComparer?

Я не нашел реализацию по умолчанию (в Delphi 2009). Так как будет вычисляться хеш-код для этих ключей?

Если это просто адрес памяти объекта в ключе «Записи словаря», будет ли поиск данной записи выполняться в последовательном порядке?

1 Ответ

5 голосов
/ 15 марта 2011

Реализация по умолчанию будет работать очень хорошо с ключом TObject. Равенство определяется как идентичность объекта, так же, как при тестировании if A=B. Хеш - это просто адрес ссылки - он не может быть более эффективным.

Код выглядит так:

function TObject.Equals(Obj: TObject): Boolean;
begin
  Result := Obj = Self;
end;

function TObject.GetHashCode: Integer;
begin
  Result := Integer(Self);
end;

Поиск в хешированном словаре не требует поиска. Это высокоэффективная операция O (1). Я думаю, вам стоит прочитать статью Wikipedia .

...