RAD Studio VCL Reference
|
TDelegatedEqualityComparer delegates all calls to user-provided callback routines.
TDelegatedEqualityComparer<T> = class(TEqualityComparer<T>);
template <T> class TDelegatedEqualityComparer : public TEqualityComparer<T>;
The primary role of TDelegatedEqualityComparer is to delegate all calls made to its GetHashCode and Equals methods to the user-supplied routines.
Use TDelegatedEqualityComparer when creating a descendant class from TEqualityComparer is not an option. Another useful feature of TDelegatedEqualityComparer is the fact that anonymous methods can be used in Delphi language to provide the required callbacks inline.
Delphi Examples:
{ This example demonstrates the usage of TDelegatedEqualityComparer and anonymous methods in order to create a custom comparer. The example assumes two memos and a button are present on the form. } procedure TForm3.Button1Click(Sender: TObject); var Dictionary: TDictionary<String, Cardinal>; Comparer: IEqualityComparer<String>; I: Integer; AString: String; begin { Create a new delegated comparer. We will use anonymous methods } Comparer := TDelegatedEqualityComparer<String>.Create( { TEqualityComparison<String> } function(const Left, Right: String): Boolean begin { Make a case insensitive comparison } Result := CompareText(Left, Right) = 0; end, { THasher<String> } function(const Value: String): Integer begin { Generate a hash code. Simply return the length of the string as its hash code } Result := Length(Value); end); { Create a new dictionary of string/cardinal } Dictionary := TDictionary<String, Cardinal>.Create(Comparer); { Populate the dictionary with strings in the memo } for I := 0 to InMemo.Lines.Count - 1 do begin { Get the list from the memo } AString := InMemo.Lines[I]; { If the string is already in the dictionary, increase its count by one. Otherwise add it with one by default. } if Dictionary.ContainsKey(AString) then Dictionary[AString] := Dictionary[AString] + 1 else Dictionary.Add(InMemo.Lines[I], 1); end; { Copy the list with numbers to the memo } OutMemo.Clear; { Now populate the out memo with string and the number of times it was present in the initial memo} for AString in Dictionary.Keys do OutMemo.Lines.Add(AString + ':' + UIntToStr(Dictionary[AString])); { Free resources } Dictionary.Free(); end;
Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
|
What do you think about this topic? Send feedback!
|