Duplicate Key 错误,但在 运行 有调试点时不重新创建

Duplicate Key error, but not recreating when run with debug points

我正在实现一个将一些数据添加到树视图的功能 - 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;
    }
}

创建 运行dom 号码:

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

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

An item with same key has already been added

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

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

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

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

提前谢谢你。

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

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

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

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