使用父IDC#将平面列表映射到层次列表;放;}}publicclassFlatCategory{publicstringID{get;放;}公共字符串名称{得到;放;}publicstringParentID{get;类别列表映射到非常规结构,如下所示:publicclassHieraricalCategoryList{publicListCategories{get;放;}}publicclassCategory{publicstringID{get;放;}公共字符串名称{得到;放;}publicstringParentID{get;放;}publicListChildCategories{get;放;我的问题是,实现这一目标的最佳方法是什么,因为可能有无限数量的子层?publicHieraricalCategoryListMapCategories(FlatCategoryListflatCategoryList){varhieraricalCategoryList=newHieraricalCategoryList();//在这里做一些事情来将平面类别列表映射到分层类别列表...returnhieraricalCategoryList;}publicHieraricalCategoryListMapCategories(FlatCategoryListflatCategoryList){varcategories=(fromfcinflatCategoryList.CategoriesselectnewCategory(){ID=fc.ID,Name=fc.Name,ParentID=fc.ParentID}).ToList();varlookup=categories.ToLookup(c=>c.ParentID);foreach(varcincategories){//如果你想要一个空列表而不是空列表,你可以跳过检查//当没有孩子时if(lookup.Contains(c.ID))c.ChildCategories=lookup[c.ID].ToList();}returnnewHieraricalCategoryList(){Categories=categories};执行此转换的一种非常简单且高效的方法是创建一个查找,您可以在其中将ID值映射到应该是ID值的位置作为节点子节点的节点可以在单个节点传递中创建此查找。之后,您可以再次遍历所有节点,将它们的子集合分配为它们在查找中的ID值的值。请注意,如果您查找映射到要转换为的类型的对象,而不是从中进行转换,这会更简单。varlookup=list.Categories.Select(category=>newCategory(){ID=category.ID,Name=category.Name,ParentID=category.ParentID,}).ToLookup(category=>category.ParentID);foreach(varcategoryinlookup.SelectMany(x=>x))category.ChildCategories=lookup[category.ID].ToList();varnewList=newHieraricalCategoryList(){Categories=lookup[null].ToList(),};使用两遍解决方案。这假设完整的集合可以放入内存。第一遍扫描类别的平面列表并构建类别字典,按ID索引。此时子集合全为空,父属性为null。然后第二遍再次扫描它们,构建子集合并设置父属性。未经测试的代码:varfinal=newDictionary();varrootCategories=new列表();//传递1foreach(varflatinflatList){Categorycat=newCategory(){ID=flat.ID,Name=flat.Name,parent=null}cat.Children=newList();final[flat.ID]=cat;}//传递2foreach(varflatinflatList){//找到自己——必须存在varself=final[flat.ID];//查找父项——可能不存在Add(self);}}这将具有O(n)运行时间,因为它是带有一些字典查找的两次线性扫描,即O(1)。改进建议答案以上是C#学习教程:MappingaflatlisttoahierarchicallistusingparentIDC#的所有内容分享,如果对大家有用需要详细了解C#学习教程,希望大家付费更多关注—publicHieraricalCategoryListMapCategories(FlatCategoryListflatCategoryList){varcategories=(fromfcinflatCategoryList.CategoriesselectnewCategory(){ID=fc.ID,Name=fc.Name,ParentID=fc.ParentID}).ToList();varlookup=categories.ToLookup(c=>c.ParentID);foreach(varcinrootCategories)//只循环遍历根类别{//如果你想要一个空列表而不是null,你可以跳过检查//当没有孩子时if(lookup.Contains(c.ID))c.ChildCategories=lookup[c.ID].ToList();}//如果你只想返回根类别而不是所有平面列表//映射的子类别。RemoveAll(c=>c.ParentId!=0);//输入你的父id是什么returnnewHieraricalCategoryList(){Categories=categories};}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
