1

Delphi 9 の TDictionary ジェネリック クラスを使用しています。私の TDictionary は次のようになります。

g_FileHandlers : TDictionary<String, TList<String>>;

そして、次のように TDictionary を初期化します。

g_FileHandlers := TDictionary<String, TList<String>>.Create;

TList も初期化しているので、それを使用して TDictionary を設定できます。TList/TDictionary に入力するために使用するファイル データをループしています。同じ TList を再利用して、値として TDictionary に挿入しようとしています。TDictionary への最初の挿入では、項目の TList 値が存在し、その中にデータが含まれています。2 回目以降の反復では、TList 値はすべて nil です。

g_FilePaths := TList<String>.Create;

このすべてを参照によって行っているように思えます。TList を参照ではなく値で TDictionary に追加するにはどうすればよいですか?

  // Create our dictionary of files and handlers
  for i := 0 to g_FileList.Count - 1 do
  begin
    g_HandlerName := AnsiMidStr(g_FileList[i], 2, Length(g_FileList[i]));
    g_HandlerName := AnsiMidStr(g_HandlerName, 1, Pos('"', g_HandlerName) - 1);

    if i = 0 then
      g_PreviousHandlerName := g_HandlerName;

    if AnsiCompareText(g_HandlerName, g_PreviousHandlerName) = 0 then
    begin
      g_FilePath := AnsiMidStr(g_FileList[i], Length(g_HandlerName) + 5, Length(g_FileList[i]));
      g_FilePath := AnsiMidStr(g_FilePath, 1, Length(g_FilePath) - 1);
      g_FilePaths.Add(g_FilePath);
    end
    else
    begin
      g_FileHandlers.Add(g_PreviousHandlerName, g_FilePaths);

      g_FilePaths.Clear;
      g_FilePath := AnsiMidStr(g_FileList[i], Length(g_HandlerName) + 5, Length(g_FileList[i]));
      g_FilePath := AnsiMidStr(g_FilePath, 1, Length(g_FilePath) - 1);
      g_FilePaths.Add(g_FilePath);
    end;

    if AnsiCompareText(g_HandlerName, g_PreviousHandlerName) <> 0 then
      g_PreviousHandlerName := g_HandlerName;

    if i = g_FileList.Count - 1 then
      g_FileHandlers.Add(g_HandlerName, g_FilePaths);
  end;
  g_FilePaths.Free;
4

1 に答える 1

2

あなたが持っているTListの「値」参照であるため、値で追加しています。(参照による追加とは、 の値を変更すると、辞書に格納されている値も変更されることを意味しますが、そうはなりません。これらの値は、最初に使用したのと同じ TList オブジェクトを参照し続けます。g_FilePaths

TDictionary は、他のオブジェクトとは異なり、オブジェクトのディープ コピーを作成しません。弾丸をかじって、追加したいすべての項目に対して新しい TList オブジェクトを作成する必要があります。必要に応じてグローバル変数を再利用できg_FilePathsますが、反復ごとに新しいオブジェクトをインスタンス化する必要があります。

于 2010-08-18T16:45:46.170 に答える