我有一个函数GetChildren,它返回一个结构中的所有子节点,因为它们需要在树视图中。
public static object GetChildrenNodes(IEnumerable<NodeDto> aNodes, Guid aNodeGuid)
{
var childrens = from childrenNode in aNodes
where (childrenNode.NodeParentGuid == aNodeGuid)
select new
{
id = childrenNode.NodeGuid,
text = childrenNode.Label,
nodes = (aNodes.Count(x => x.NodeParentGuid == childrenNode.NodeGuid) > 0) ? GetChildrenNodes(aNodes, childrenNode.NodeGuid) : null
};
return childrens;
}
此函数必须保持原样,因为TreeView需要这种对象来构建自己。
我想使用相同的函数来删除节点的guid,所以我有:
object nodesList = GetChildrenNodes(nodeList, aNodeGuid);
我想从对象List<Guid> guids
的{#1; id&#34;}获取nodesList
,所以我请你帮忙。
答案 0 :(得分:2)
我会避免使用相同的方法。您有两个不同的要求:
(我假设你只想要直接的孩子,而不是所有的后代?它不清楚。)
他们可能有相同的过滤器,但这是关于所有。我建议将公共部分(过滤)分解出来,然后使用两种不同的方法来调用它:
private static IEnumerable<NodeDto> FindChildren(
IEnumerable<NodeDto> allNodes, Guid parentId) =>
allNodes.Where(node => node.NodeParentGuid == parentId);
public static object GetChildrenNodes(IEnumerable<NodeDto> allNodes, Guid parentId) =>
FindChildren(allNodes, parentId).Select(node =>
{
id = childrenNode.NodeGuid,
text = childrenNode.Label,
nodes = allNodes.Any(x => x.NodeParentGuid == node.NodeGuid)
? GetChildrenNodes(allNodes, node.NodeGuid) : null
});
public static List<Guid> FindChildIds(IEnumerable<NodeDto> allNodes, Guid parentId) =>
FindChildren(allNodes, parentId).Select(node => node.NodeGuid).ToList();
答案 1 :(得分:1)
执行此操作的正确方法是定义TreeNode类并使用它而不是匿名类...如果您真的想要,则可以在调用此方法后执行.Select。
那说如果你坚持 - 你可以尝试铸造动态?然后转换Id属性...虽然这让我感到畏缩,你应该真正定义一个TreeNode类并使用它而不是匿名类......
List<Guid> guids = new List<Guid>();
for (var node in nodeList){
guids.Add((Guid)(node as dynamic).Id);
}