1

これが私が学ぼうとしていたコードですが、行き詰まっています

uses
  System.Generics.Defaults, System.Generics.Collections, System.AnsiStrings,
  …

 try
      sortedDictKeys.Sort(TComparer.Construct(
       function (const L, R: integer): integer
       begin
         result := R - L;
       end
       )) ;

宣言されていない識別子TComparer.Construct(

そして、about.comから試した上記のコードの実際のパラメータエラーが多すぎます

ジェネリックの基礎について学ぼうとしていたこと。私はここで立ち往生していて、なぜコンパイルされないのかわかりません。

完全なコードはここにあります:http://delphi.about.com/od/beginners/a/using-t-dictionary-hash-tables-in-delphi.htm

また、誰かが私にジェネリックパラメータでTDictionaryを学ぶための正しい方向を示した場合、それは素晴らしいことです。

4

1 に答える 1

3

表示するコードは Generics クラスを使用しようとしていますが、型が含まれていません。

Delphi の以前のバージョンでコンパイラが宣言から型を推測するかどうかはわかりませんが、通常は次のように型を宣言する必要があります。

uses Generics.Defaults, Generics.Collections;

...

    sortedDictKeys := TList<Integer>.Create(dict.Keys);
    try
      sortedDictKeys.Sort(TComparer<Integer>.Construct(
       function (const L, R: integer): integer
       begin
         result := R - L;
       end
       )) ;
      for i in sortedDictKeys do
        log.Lines.Add(Format('%d, %s', [i, dict.Items[i]]));
    finally
      sortedDictKeys.Free;
    end;

リンクされた about.com の記事からコードを取得し、コンパイルするようにしましたが、テストしませんでした。

コメントで要求されているように、完全な関数は次のようになります。

var
  dict : TDictionary<integer, char>;
  sortedDictKeys : TList<integer>;
  i, rnd : integer;
  c : char;
begin
  log.Clear;
  log.Text := 'TDictionary usage samples';

  Randomize;

  dict := TDictionary<integer, char>.Create;
  try
    //add some key/value pairs (random integers, random characters from A in ASCII)
    for i := 1 to 20 do
    begin
      rnd := Random(30);

      if NOT dict.ContainsKey(rnd) then dict.Add(rnd, Char(65 + rnd));
    end;

    //remove some key/value pairs (random integers, random characters from A in ASCII)
    for i := 1 to 20 do
    begin
      rnd := Random(30);

      dict.Remove(rnd);
    end;

    //loop elements - go through keys
    log.Lines.Add('ELEMENTS:');
    for i in dict.Keys do
      log.Lines.Add(Format('%d, %s', [i, dict.Items[i]]));

    //do we have a "special" key value
    if dict.TryGetValue(80, c) then
      log.Lines.Add(Format('Found "special", value: %s', [c]))
    else
      log.Lines.Add(Format('"Special" key not found', []));


    //sort by keys ascending
    log.Lines.Add('KEYS SORTED ASCENDING:');
    sortedDictKeys := TList<integer>.Create(dict.Keys);
    try
      sortedDictKeys.Sort; //default ascending
      for i in sortedDictKeys do
        log.Lines.Add(Format('%d, %s', [i, dict.Items[i]]));
    finally
      sortedDictKeys.Free;
    end;

    //sort by keys descending
    log.Lines.Add('KEYS SORTED DESCENDING:');
    sortedDictKeys := TList<Integer>.Create(dict.Keys);
    try
      sortedDictKeys.Sort(TComparer<Integer>.Construct(
       function (const L, R: integer): integer
       begin
         result := R - L;
       end
       )) ;
      for i in sortedDictKeys do
        log.Lines.Add(Format('%d, %s', [i, dict.Items[i]]));
    finally
      sortedDictKeys.Free;
    end;

  finally
    dict.Free;
  end;
end;
于 2012-12-21T08:18:31.417 に答える