如何使用C#获取父类别?(包括网络提琴)

如何使用C#获取父类别?(包括网络提琴),c#,linq,C#,Linq,为了演示这里发生了什么,我创建了这个 哪个输出 Category 2 Category 3 现在我需要回答相反的问题。如何按Id获取父类别 进入 var children = GetParentCategories(list, 3); 应导致 Category 1 Category 2 我建议在这里使用DFS就是一个例子 public static void GetParentsCategories(IEnumerable<Category> entities, Li

为了演示这里发生了什么,我创建了这个

哪个输出

Category 2
Category 3
现在我需要回答相反的问题。如何按Id获取父类别

进入

var children = GetParentCategories(list, 3);
应导致

Category 1
Category 2

我建议在这里使用DFS就是一个例子

     public static void GetParentsCategories(IEnumerable<Category> entities, List<string> parents, int? nodeId = null)
    {
        var currentNode = entities.Where(x => x.Id == nodeId).FirstOrDefault();
        if (currentNode == null)
            return;
        var parent = entities.Where(x => x.Id == currentNode.ParentCategoryId).FirstOrDefault();
        if (parent == null)
            return;
        parents.Add(parent.TitleEN);
        GetParentsCategories(entities, parents, parent.Id);
    }
public static void GetParentsCategories(IEnumerable实体,列出父项,int?nodeId=null)
{
var currentNode=entities.Where(x=>x.Id==nodeId.FirstOrDefault();
if(currentNode==null)
返回;
var parent=entities.Where(x=>x.Id==currentNode.ParentCategoryId).FirstOrDefault();
如果(父项==null)
返回;
parents.Add(parent.TitleEN);
GetParentsCategories(实体、父对象、父对象Id);
}
只需在调用后将parents作为参数传递即可检查结果

在此使用迭代器编辑其他版本:

   public static IEnumerable<string> GetParentsCategories(IEnumerable<Category> entities,  int? nodeId = null)
    {
        var currentNode = entities.Where(x => x.Id == nodeId).FirstOrDefault();
        var parent = entities.Where(x => x.Id == currentNode.ParentCategoryId).FirstOrDefault();
        if (parent == null)
            yield break;
        yield return parent.TitleEN;
         foreach (var trail in GetParentsCategories(entities, parent.Id))
            yield return (trail);

    }
公共静态IEnumerable GetParentsCategories(IEnumerable实体,int?nodeId=null)
{
var currentNode=entities.Where(x=>x.Id==nodeId.FirstOrDefault();
var parent=entities.Where(x=>x.Id==currentNode.ParentCategoryId).FirstOrDefault();
如果(父项==null)
屈服断裂;
收益率-收益率-母公司;
foreach(GetParentsCategories(实体,parent.Id)中的var trail)
收益率(trail);
}

为什么
GetParentCategories(列表,3)
应该得到1和2?是因为3的父母是2,祖父母是1吗?您使用的是多层结构(树),您是否认为在搜索时使用另一种有效的数据结构,如地图或邻接列表?您是否可以向我们提供您的想法或您已经做了什么,这是一个搜索问题,你可以使用很多技术。在这种情况下,DFS是一个很好的选择。如果您计划使用linq(它是自连接关系),我不确定linq中是否存在这种情况。@OfirD完全正确。时间复杂性不是最好的O(N)2您可以使用不同的数据结构,甚至可能得到O(N)解决方案。这太棒了!谢谢我是否也应该在GetParentsCategories函数返回的结果中使用Reverse()?可以使用Reverse,但这取决于逻辑。您也可以从末尾读取列表。您还可以更新函数参数(如果可用),以包含父id(如果可用),这将对运行时进行太多优化,但很少:D
     public static void GetParentsCategories(IEnumerable<Category> entities, List<string> parents, int? nodeId = null)
    {
        var currentNode = entities.Where(x => x.Id == nodeId).FirstOrDefault();
        if (currentNode == null)
            return;
        var parent = entities.Where(x => x.Id == currentNode.ParentCategoryId).FirstOrDefault();
        if (parent == null)
            return;
        parents.Add(parent.TitleEN);
        GetParentsCategories(entities, parents, parent.Id);
    }
   public static IEnumerable<string> GetParentsCategories(IEnumerable<Category> entities,  int? nodeId = null)
    {
        var currentNode = entities.Where(x => x.Id == nodeId).FirstOrDefault();
        var parent = entities.Where(x => x.Id == currentNode.ParentCategoryId).FirstOrDefault();
        if (parent == null)
            yield break;
        yield return parent.TitleEN;
         foreach (var trail in GetParentsCategories(entities, parent.Id))
            yield return (trail);

    }