【问题标题】:How to recursively get all the parents from a child c#?如何递归地从孩子c#中获取所有父母?
【发布时间】:2022-01-27 09:28:55
【问题描述】:

有所有视图位置(比如说 100 个,这些是 TreeView 的位置): ID、名称、父 ID 1 根空 2 半根 1 3 半半根 2 4 ...... ....

还有一些数据,其中我们仅从另一个请求中收到与我们的值相对应的那些位置: ID、名称、父 ID 22 位置 1 12 36 位置38 21 99 位置38 3

需要获取我们从请求中获得的数据的所有父层次结构。 有课:

public class TreeViewNode {
  public Guid Id {get; set;}
  public string Name {get; set;}
  public Guid ParentId {get; set;}
}

测试数据:

 private IEnumerable<TreeViewNode> SeedData()
        {
            return new List<TreeViewNode>
            {
                new()
                {
                    Id = 1,
                    Name = "Root",
                    ParentId = null
                },
                new()
                {
                    Id = 2,
                    Name = "Semi-root",
                    ParentId = 1
                },
                new()
                {
                    Id = 3,
                    Name = "Semi te",
                    ParentId = 2
                },
                new()
                {
                    Id = 4,
                    Name = "Semi oi",
                    ParentId = 2
                },
                new()
                {
                    Id = 5,
                    Name = "Child",
                    ParentId = 3
                },
                new()
                {
                    Id = 6,
                    Name = "Child 1",
                    ParentId = 4
                },
                new()
                {
                    Id = 7,
                    Name = "Child 2",
                    ParentId = 1
                },
                new()
                {
                    Id = 8,
                    Name = "Child 3",
                    ParentId = 1
                },
                new()
                {
                    Id = 9,
                    Name = "Child 4",
                    ParentId = 1
                },
                new()
                {
                    Id = 10,
                    Name = "Child 6",
                    ParentId = 2
                }
            };
        }

从请求中获得的示例数据:

 var dataFromRequest = new List<TreeViewNode>
            {
                new()
                {
                    Id = 8,
                    Name = "Child 3",
                    ParentId = 1
                },
                new()
                {
                    Id = 10,
                    Name = "Child 6",
                    ParentId = 2
                },
                new()
                {
                    Id = 33,
                    Name = "Child",
                    ParentId = 3
                },
                new()
                {
                    Id = 4,
                    Name = "Semi oi",
                    ParentId = 2
                }
            };

因此需要得到这样的父母名单:

Id Name ParentId
1 Root Null
2 Semi-root 1
3 Semi te 2

这里可以有 5 个或更多级别的父母

【问题讨论】:

    标签: c# .net recursion treeview


    【解决方案1】:

    类似的东西

    // create Dictionary for lookups
    var lookup = dataFromRequest.ToDictionary(x => x.Id.Value, x => x);
    
    var lookFor = new TreeViewNode()
    {
        Id = 6,
        Name = "Child 1",
        ParentId = 4
    };
    
    // get all the parents
    GetParents(lookup, lookFor);
    

    获取所有父母的辅助方法

    private void GetParents(Dictionary<int, TreeViewNode> lookup, 
                                    TreeViewNode lookFor)
    {
        while (lookFor != null)
        {
            // Alternative: Add lookFor to List<TreeViewNode> here and return at 
            // the end of the method
            Debug.WriteLine($"{lookFor.Id} {lookFor.Name} {lookFor.ParentId}");
    
            if (lookFor.ParentId == null)
                break;
    
            // cast ParentId to corrent dataType here Guid or int
            lookup.TryGetValue((int)lookFor.ParentId, out var parentNode);
            lookFor = parentNode;
        }
    
    }
    

    当你得到更多IEnumerable&lt;TreeViewNode&gt;时,记得保持你的查找字典是最新的

    您可以做的另一件事是在 TreeViewNode 中设置父节点,如下所示:

    public class TreeViewNode {
        ...
        // set ParentNode by lookup in the Dictionary once
        public TreeViewNode ParentNode {get; set;}
    }
    

    【讨论】:

    • 谢谢,很有帮助!!!但是如何避免返回列表中的重复?我这样做: var parentList = new List(); foreach(viewLocations 中的变量位置){ parentList.AddRange(GetParents(查找,位置));并得到重复的父母,现在我正在做 parentList.Distinct(),也许我们可以在没有 Disctinct 的情况下做到这一点吗?
    • @Jack 改用new HashSet&lt;TreeViewNodeDto&gt;,但使用 Distinct 也可以
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多