public static bool AllNodesChecked(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
if (!node.Checked)
{
return false;
}
AllNodesChecked(node.Nodes);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
测试树是
A1(checked) -> B1(unchecked)
A2(checked)
A3(checked)
Run Code Online (Sandbox Code Playgroud)
但是当它到达节点B1时它不会返回.
编辑:谢谢大家帮助我疲惫的大脑.只能在冷水淋浴后的第二天早些时候尝试递归.
Meh*_*ari 20
您忽略AllNodesChecked递归调用中的返回值:
public static bool AllNodesChecked(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
if (!node.Checked || !AllNodesChecked(node.Nodes))
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
该return语句仅从调用堆栈中的当前方法返回到直接调用方.它不会突然从调用堆栈中的所有其他调用返回.
更改:
AllNodesChecked(node.Nodes);
Run Code Online (Sandbox Code Playgroud)
至:
if(!AllNodesChecked(node.Nodes))
return false;
Run Code Online (Sandbox Code Playgroud)
我会采取略微不同的方法.我要做的是我首先编写的代码将你的树(我认为它真的是一棵树,而不是任意图形)变成一系列节点.就像是:
static IEnumerable<Node> AllNodes(this Node node)
{
var stack = new Stack<Node>();
stack.Push(node);
while(stack.Count > 0)
{
var current = stack.Pop();
yield return current;
foreach(var child in current.Nodes)
stack.Push(child);
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以使用序列运算符:
bool allChecked = root.AllNodes().All(x=>x.Checked);
Run Code Online (Sandbox Code Playgroud)
没有递归,没问题.
| 归档时间: |
|
| 查看次数: |
874 次 |
| 最近记录: |