【发布时间】:2021-11-30 14:29:35
【问题描述】:
如果存在具有指定名称的节点,我正在研究一种方法,该方法会给出下一个可用节点名称。但想法是该方法从最大值给出下一个,例如:
如果我添加一个名为“test”的新节点,该方法应该返回“test6”而不是“test2”。包含数字作为名称的节点也会发生同样的情况:
如果我添加一个名为“20”的新节点,下一个可用的名称应该是“31”。
所以我们的想法是从序列中获取“最大值”并将其添加到其中。这个树节点很容易包含超过500个节点,所以这个方法的优化非常重要。我一直在尝试使用此代码执行此操作,但没有按预期工作:
internal static string GetNextAvailableName(TreeView treeView, string searchFor)
{
//Check if item exists
if (NodeExistsInSection(treeView, searchFor))
{
return searchFor;
}
else
{
//Initialize variables
string nextAvailableName = searchFor;
int counter = 0;
Match result = Regex.Match(searchFor, @"\d+$", RegexOptions.RightToLeft);
if (result.Success)
{
counter = int.Parse(result.Value);
if (searchFor.Length >= result.Value.Length)
{
searchFor = searchFor.Substring(0, (searchFor.Length - result.Value.Length));
}
}
while (SearchRecByText(treeView, nextAvailableName) != null)
{
counter++;
nextAvailableName = string.Join("", searchFor, counter);
}
return nextAvailableName;
}
}
internal static bool NodeExistsInSection(TreeView treeView, string searchFor)
{
bool nodeExists = false;
// Print each node recursively.
foreach (TreeNode n in treeView.Nodes)
{
//recursiveTotalNodes++;
if (LoopNodesRecursive(n, searchFor) != null)
{
nodeExists = true;
break;
}
}
return nodeExists;
}
internal static TreeNode SearchRecByText(TreeView treeView, string searchFor)
{
TreeNode matchedNode = null;
// Print each node recursively.
foreach (TreeNode n in treeView.Nodes)
{
//recursiveTotalNodes++;
matchedNode = LoopNodesRecursive(n, searchFor);
if (matchedNode != null)
{
break;
}
}
return matchedNode;
}
private static TreeNode LoopNodesRecursive(TreeNode treeNode, string searchFor)
{
// Visit each node recursively.
foreach (TreeNode tn in treeNode.Nodes)
{
if (tn.Text.Equals(searchFor, StringComparison.OrdinalIgnoreCase))
{
return tn;
}
}
return null;
}
【问题讨论】:
-
树是否允许在不同的分支中包含重复的lead节点?
-
“它没有按预期工作”不是一个好的大报告。在每个好的错误报告都应该包含的期望-实际-差异三角形中,你只做了一个;至少需要两个。说明您的实际情况和/或您的差异
标签: c# winforms treeview treenode