如何在这样的树形结构中获取父节点 [英] How to get parent node in a tree structure like this

查看:29
本文介绍了如何在这样的树形结构中获取父节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当树结构是这样的时候怎么可能得到一个父级:

How it would be possible to get a parent when tree structure is like this:

public class TreeModel
{
    public int ID { get; set; }
    public List<TreeModel> Children { get; set; }
}

假设我们不能向此类添加父元素项(公共TreeModel Parent {get; set;}).

Let's say we can't add a parent element item to this class (public TreeModel Parent { get; set; }).

如何从m1获取元素m22(ID = 22)父m2(ID = 2)?我以为我们可以遍历m1并在条件合适时以某种方式返回父项.

How to get element m22 (ID=22) parent m2 (ID=2) from the m1? I thought we could iterate through m1 and somehow return parent when condition is right.

var m1  = new TreeModel() { ID = 1  };
var m2  = new TreeModel() { ID = 2  };
var m21 = new TreeModel() { ID = 21 };
var m22 = new TreeModel() { ID = 22 };
var m3  = new TreeModel() { ID = 3  };

m1.Children.Add(m2);
m2.Children.Add(m21);
m2.Children.Add(m22);
m1.Children.Add(m3);

var parent = m1.GetParent(p => p.ID == 22); //<-- How?

推荐答案

public IEnumerable<TreeModel> GetAllDescendants(IEnumerable<TreeModel> rootNodes)
{
    var descendants = rootNodes.SelectMany(_ => GetAllDescendants(_.Children));
    return rootNodes.Concat(descendants);
}


public static TreeModel GetParent(this TreeModel rootNode, Func<TreeModel, bool> childSelector)
{
    var allNodes = GetAllDescendants(new [] { rootNode });
    var parentsOfSelectedChildren = allNodes.Where(node => node.Children.Any(childSelector));

    return parentsOfSelectedChildren.Single();
}

m1.GetParent(_ => _.ID == 22);

  1. 获取所有节点的平面列表
  2. 在此列表中搜索其直接子级包含m22的节点

这篇关于如何在这样的树形结构中获取父节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆