我的控件中有一个Treeview
我正在使用Tag
属性保留它所代表的对象的副本。这样,当我点击树中的任何项目时,我可以轻松掌握它所指的对象。
我现在正在为此添加一个节点,我想通过存储对象中的属性快速搜索节点。
类似于此:
class MyObject
{
int Index;
}
IEnumerable<TreeNode> nodes = this.myTree.Nodes[0].Nodes.Cast<TreeNode>();
TreeNode currentNode = (from node in nodes
let ts = node.Tag as MyObject
where ts.Index == eqId.Index
select node).First();
这有效但我不知道我是否正确地做到了或者是否有更简单的解决方案。这会搜索特定级别的所有节点,如果我说得对,但是一旦找到第一个节点,我可以让它停止而不是搜索整个树吗?
是否有更简单的方式在Tags
内进行搜索,或者我的做法是错误的?
答案 0 :(得分:1)
基本上,这没关系。关于细节:
如果您希望在找到匹配后立即停止枚举,那么您应该为树视图编写自己的枚举器:
public static IEnumerable<TreeNode> Descendants(this TreeNodeCollection c)
{
foreach (var node in c.OfType<TreeNode>())
{
yield return node;
foreach (var child in node.Nodes.Descendants())
{
yield return child;
}
}
}
并且
IEnumerable<TreeNode> nodes = this.myTree.Nodes.Desscendants();
我注意到您的代码只搜索根级别。我提供的代码搜索每个节点,包括后代。如果您不想这样,请删除嵌套的foreach循环。
另外,请确保使用.FirstOrDefault而不是.First。如果没有匹配,那么你将有一个空值而不是一个例外。
恕我直言的最简单方式是:
TreeNode currentNode = nodes.FirstOrDefault(n => (n.Tag as MyObject).Index == eqId.Index);