TDictionary Delphi, мои объекты Value вставляются как нулевые - PullRequest
1 голос
/ 18 августа 2010

Я использую универсальный класс TDictionary в Delphi 9.Мой TDictionary выглядит так:

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

И, таким образом, я инициализирую TDictionary следующим образом:

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

У меня есть TList, который я также инициализирую, так что я могуиспользуйте его для заполнения TDictionary.Я перебираю некоторые данные файла, которые я использую для заполнения TList / TDictionary, и я пытаюсь повторно использовать тот же TList для вставки в TDictionary в качестве значения.При первой вставке в TDictionary значение TList элемента существует и содержит данные.На второй и последующих итерациях значения TList равны нулю.

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;

1 Ответ

2 голосов
/ 18 августа 2010

Значение "TList", которое у вас есть , является ссылкой, поэтому вы добавляете к значению. (Добавление по ссылке будет означать, что если вы измените значение g_FilePaths, значения, хранящиеся в словаре, также изменятся, но этого не произойдет - эти значения будут продолжать ссылаться на тот же объект TList, с которого они начали.

TDictionary не делает глубоких копий объектов, как никто другой. Вам просто нужно будет прикусить пулю и создать новый объект TList для каждого элемента, который вы хотите добавить. Вы можете повторно использовать глобальную переменную g_FilePaths, если хотите, но вам нужно создавать экземпляр нового объекта каждую итерацию.

...