Delphi's Tdyctionary, мои ценности объекты вставляют как null

StackOverflow https://stackoverflow.com/questions/3514374

  •  29-09-2019
  •  | 
  •  

Вопрос

Я использую Delphi 9's Tdictionary Generic Class. Мой tdictionary выглядит так:

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

И, так что я инициализирую, как это так:

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

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

g_FilePaths := TList<String>.Create;

Звучит мне, как будто это делает все это по ссылке. Кто-нибудь знает, как добавить TLIST в мой TDISTARY по значению, вместо ссылки?

Спасибо

  // 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;
Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top