我有关于父母子女关系的数据,使用Linq可以直接找到给定父母的所有子女,但是我有其他问题,可以在提供子女时找到所有父母。
List<FlatData> elements = new List<FlatData>
{
new FlatData {Id = 1, ParentId = NULL ,Text = "Apple"},
new FlatData {Id = 2, ParentId = 1, Text = "Cat"},
new FlatData {Id = 3, ParentId = 2, Text = "Dog"},
new FlatData {Id = 4, ParentId = 3, Text = "Elephant"}
};
当给定Id 4时,我需要能够反向遍历并使用LINQ(lambda表达式)查找所有父级,对您的帮助将不胜感激。
最佳答案
您可以使用递归来执行以下操作:
private IEnumerable<FlatData> FindAllParents(List<FlatData> all_data, FlatData child)
{
var parent = all_data.FirstOrDefault(x => x.Id == child.ParentId);
if (parent == null)
return Enumerable.Empty<FlatData>();
return new[] {parent}.Concat(FindAllParents(all_data, parent));
}
并像这样使用它:
int id = 4;
var child = elements.First(x => x.Id == id);
var parents = FindAllParents(elements, child).ToList();
此解决方案有效,但是如果您的数据集较大,则应考虑使用
Dictionary<int,FlatData>
使其在获取FlatData
的情况下更快地获取Id
对象。在这种情况下,方法如下所示:
private IEnumerable<FlatData> FindAllParents(Dictionary<int,FlatData> all_data, FlatData child)
{
if(!all_data.ContainsKey(child.ParentId))
return Enumerable.Empty<FlatData>();
var parent = all_data[child.ParentId];
return new[] {parent}.Concat(FindAllParents(all_data, parent));
}
这是您将如何使用它:
var dictionary = elements.ToDictionary(x => x.Id); //You need to do this only once to convert the list into a Dictionary
int id = 4;
var child = elements.First(x => x.Id == id);
var parents = FindAllParents(dictionary, child).ToList();
关于c# - 在树层次结构中为给定的子级LINQ查找父级(lambda表达式),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34730349/