如何从 child c# 中递归获取所有 parents?
How to recursively get all the parents from a child c#?
有所有视图位置(比方说 100,这些是 TreeView 的位置):
身份证、姓名、父母身份证
1根空
2 Semi-root 1
3 Semi-semi-root 2
4 ..... ....
并且有一些数据,其中我们仅从另一个请求中收到与我们的值相对应的那些位置:
身份证、姓名、父母身份证
22 地点 1 12
36 地点38 21
99 位置 38 3
需要获取我们从请求中获取的数据的所有 parent 层次结构。
有 class:
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
}
};
因此需要像这样获取 parent 的列表:
Id Name ParentId
1 Root Null
2 Semi-root 1
3 Semi te 2
这里可以有5层或更多的parents
像这样
// 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);
获取所有parents
的辅助方法
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<TreeViewNode>
您可以做的另一件事是在 TreeViewNode
中设置 parent 节点,如下所示:
public class TreeViewNode {
...
// set ParentNode by lookup in the Dictionary once
public TreeViewNode ParentNode {get; set;}
}
有所有视图位置(比方说 100,这些是 TreeView 的位置): 身份证、姓名、父母身份证 1根空 2 Semi-root 1 3 Semi-semi-root 2 4 ..... ....
并且有一些数据,其中我们仅从另一个请求中收到与我们的值相对应的那些位置: 身份证、姓名、父母身份证 22 地点 1 12 36 地点38 21 99 位置 38 3
需要获取我们从请求中获取的数据的所有 parent 层次结构。 有 class:
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
}
};
因此需要像这样获取 parent 的列表:
Id Name ParentId
1 Root Null
2 Semi-root 1
3 Semi te 2
这里可以有5层或更多的parents
像这样
// 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);
获取所有parents
的辅助方法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<TreeViewNode>
您可以做的另一件事是在 TreeViewNode
中设置 parent 节点,如下所示:
public class TreeViewNode {
...
// set ParentNode by lookup in the Dictionary once
public TreeViewNode ParentNode {get; set;}
}