在树层次结构中为给定的子级LINQ查找父级(lambda表达式) [英] Finding parents in a tree hierarchy for a given child LINQ (lambda expression)

查看:154
本文介绍了在树层次结构中为给定的子级LINQ查找父级(lambda表达式)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have data with parent child relationships, finding all children for a given parent is straight forward using Linq, however I have problem other way around, finding all of parents when child is provided.

  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(拉姆达表达式)查找所有父代.

When Id 4 is given I need to able to reverse traverse and find all parents using LINQ (lambda expression).

推荐答案

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

You can use recursion to do something like this:

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>使其在获取Id的情况下更快地获取FlatData对象.

This solution works, but if you have a large data set, then you should consider using a Dictionary<int,FlatData> to make it it faster to fetch a FlatData object given it's Id.

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

Here is how the method would look like in this case:

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

这篇关于在树层次结构中为给定的子级LINQ查找父级(lambda表达式)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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