我正在使用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值存在并且其中包含数据。在第二次和随后的迭代中,虽然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;
答案 0 :(得分:2)
您拥有的TList“值”是一个引用,因此您 按值添加它。 (通过引用添加意味着如果您更改了g_FilePaths
的值,则字典中存储的值也会更改,但这不会发生 - 这些值将继续引用它们开始时使用的相同TList对象。
TDictionary不会像其他任何内容那样制作对象的深层副本。你将不得不咬紧牙关并为你想要添加的每个项目创建一个新的TList对象。如果需要,可以重用全局变量g_FilePaths
,但每次迭代都需要实例化一个新对象。