当前位置:  开发笔记 > 编程语言 > 正文

在给定子项LINQ(lambda表达式)的树层次结构中查找父项

如何解决《在给定子项LINQ(lambda表达式)的树层次结构中查找父项》经验,为你挑选了1个好方法。

我有父母子女关系的数据,发现给定父母的所有孩子都是直接使用Linq,但我有其他问题,在提供孩子时找到所有父母.

  List elements = new List
          {
   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表达式)查找所有父项,非常感谢任何帮助.



1> Yacoub Massa..:

您可以使用递归来执行以下操作:

private IEnumerable FindAllParents(List all_data, FlatData child)
{
    var parent = all_data.FirstOrDefault(x => x.Id == child.ParentId);

    if (parent == null)
        return Enumerable.Empty();

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

这个解决方案有效,但是如果你有一个大的数据集,那么你应该考虑使用a Dictionary来更快地获取FlatData给定的对象Id.

以下是该方法在这种情况下的样子:

private IEnumerable FindAllParents(Dictionary all_data, FlatData child)
{
    if(!all_data.ContainsKey(child.ParentId))
        return Enumerable.Empty();

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

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有