从对象C#获取列表<guid>

时间:2017-07-04 08:36:49

标签: c#

我有一个函数Ge​​tChildren,它返回一个结构中的所有子节点,因为它们需要在树视图中。

 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,所以我请你帮忙。

2 个答案:

答案 0 :(得分:2)

我会避免使用相同的方法。您有两个不同的要求:

  • 构建一组匿名类型以供在UI中使用
  • 为给定节点ID的子项构建GUID列表

(我假设你只想要直接的孩子,而不是所有的后代?它不清楚。)

他们可能有相同的过滤器,但这是关于所有。我建议将公共部分(过滤)分解出来,然后使用两种不同的方法来调用它:

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);
}