tengo un caso utilizando TDictionary:¿Cómo crear un caso de TEqualityComparer en caso de TDictionary?
var D: TDictionary<string, integer>;
begin
D := TDictionary<string, integer>.Create(TCustomEqualityComparer.Create());
try
D.Add('One', 1);
D.Add('Two', 2);
D.Add('Three', 3);
showmessage(inttostr(D.Items['One']));
showmessage(inttostr(D.Items['TWO']));
finally
D.Free;
end;
end;
Clase TCustomEqualityComparer se copia de Generics Defaults TEqualityComparer (Delphi) con modificaciones menores en el método GetHashCode:
TCustomEqualityComparer = class(TEqualityComparer<string>)
public
function Equals(const Left, Right: string): Boolean; override;
function GetHashCode(const Value: string): Integer; override;
end;
function TCustomEqualityComparer.Equals(const Left, Right: string): Boolean;
begin
Result := SameText(Left, Right);
end;
function TCustomEqualityComparer.GetHashCode(const Value: string): Integer;
begin
Result := BobJenkinsHash(Value[1], Length(Value) * SizeOf(Value[1]), 0);
end;
lo esperado El TCustomEqualityComparer capaz de realizar la coincidencia entre mayúsculas y minúsculas para el valores clave Por ejemplo:
D.Items['TWO']
Sin embargo, aparece la excepción "Objeto no encontrado". Estoy usando Delphi 2010 versión 14.0.3513.24210.
¿Alguien sabe cómo funciona mi código?
¿Seguro es igual al original ya está entre mayúsculas y minúsculas? Este es el original Equals método definido en Generics.Defaults.pas unidad: función Equals_UString (Inst: PSimpleInstance; const Izquierda, Derecha: UnicodeString): Boolean; begin Resultado: = Left = Right; final; –
¡Tienes razón! Mezclé la implementación original y un ejemplo. –