RAD Studio VCL Reference
ContentsIndex
PreviousUpNext
TDelegatedEqualityComparer Class

TDelegatedEqualityComparer delegates all calls to user-provided callback routines.

Pascal
TDelegatedEqualityComparer<T> = class(TEqualityComparer<T>);
C++
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!