gpt4 book ai didi

c# - Duplicate Key 错误,但在使用调试点运行时不会重新创建

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:30 25 4
gpt4 key购买 nike

我正在实现一个将一些数据添加到 TreeView 的功能 - MVP(应用程序由 Word ribbon (VSTO) + C# 代码库组成)。下面是我的代码。

private ElementTreeNode LoadElement(Element element, ElementTreeNode parent = null)
{
ElementTreeNode loadElement;
ElementTreeNode node;

//Add a node to the TreeView that represents the element.
loadElement = Add(text: GetElementNodeText(element.Name), parent: parent);
loadElement.Element = element;

//Add a node to the TreeView for conditions
if (element.TSS.Conditions.Count > 0)
{
Add(text: "Conditions", parent: loadElement).Conditions = element.TSS.Conditions;
}

//Add a node to the TreeView control for each image within the element.
foreach (Image image in element.FrameSets.Active.Images)
{
Add(text: GetImageNodeText, parent: loadElement).Image = image;
}

//Call this procedure recursively to add any nested elements.
foreach (Element objElement in element.FrameSets.Active.Elements)
{
LoadElement(element: objElement, parent: loadElement);
}

return loadElement;
}

添加方法:

private ElementTreeNode Add(string text, string key = "", ElementTreeNode parent = null)
{
try
{
TreeNode node = null;
//Create a random key if a key is not specified.
if (key.Length == 0)
{
key = "ElementTreeNode_" + GetRandomNumber();
}

//Add a node to the TreeView control.
if (parent == null) //..............point 1
{
node = treeView.Nodes.Add(key: key, text: text);
}
else // ..............point 2
{
node = parent.Node.Nodes.Add(key: key, text: text);
}
//Add a new ElementTreeNode object to this collection. It will have the same key as objNode.
ElementTreeNode objNode = new ElementTreeNode(node);
elementTreeNodesCollection.Add(key: key, value: objNode);

return objNode;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + Environment.NewLine + "ElementTreeNodes.Add","MyApp,
MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}

创建随机数:

public long GetRandomNumber()
{
Random rnd = new Random();
return rnd.Next();
}

问题是,在我的测试运行中此代码首先将父元素添加到 TreeView 并添加到集合中(Dictionary<string, ElementTreeNode> elementTreeNodesCollection)。在下一步中,“条件”树节点将作为父元素下的子节点添加到树节点。当我尝试将它添加到 elementTreeNodesCollection 时,它给出以下错误。

An item with same key has already been added

最大的问题是,如果我在 Add 方法中将调试点放在 点 1 或之前(整个代码库中没有其他调试点),我不会收到任何错误,并且项目已添加到 TreeView 和集合很好。

但是如果我在点 2 或之后添加调试点,我会收到错误。此外,当没有断点时,我也会收到此错误。

我尝试将 key 设置为递增数字,然后代码运行正常。但是我需要在这里使用一个随机数,因为 LoadElement 方法涉及递归。这个问题与随机数生成函数有关吗?或其他情况?我真的被困在这里了。

有人知道我在这里做错了什么吗?

提前致谢。

最佳答案

我强烈怀疑问题出在您的 GetRandomNumber() 方法上,它取决于当前时间。如果您快速连续多次调用它,您最终会从中得到相同的数字。

如果您在通话之间稍等片刻 - 例如由于在断点处暂停 - 您将获得不同的随机数。

我建议最简单的选择是使数字完全不是随机的 - 保留一个计数器,每次需要创建新 key 时该计数器都会递增。或者您可以使用 Guid.NewGuid() 并将其转换为字符串或类似内容。

如果您真的想使用 Random,请创建一个 Random 的实例,用于所有调用 - 但请注意 Random > 不是线程安全的;如果您需要跨多个线程工作,一切都会变得更加复杂。

关于c# - Duplicate Key 错误,但在使用调试点运行时不会重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56840084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com