在层次树中搜索以获取仅包含结果节点的树

时间:2019-01-02 19:46:39

标签: c# nested hierarchy

我有层次结构树,每个元素都有一个子级列表,依此类推。 这是课程:

public class HierarchyItem
{
    public int? HierarchyID { get; set; }
    public string label { get; set; }
    public List<HierarchyItem> children { get; set; }
    public int Level { get; set; }
    public int ParentID { get; set; }        
}

我正在尝试搜索其标签包含我的搜索词的所有节点。

我已经设法获得与搜索词匹配的节点。 另外,我创建了一个递归以获取与搜索词匹配的每个节点的所有父节点(直到顶部节点)。

问题在于,这样我得到了反向树: 每个孩子都有一个有父母的父母等等,而不是让有一个孩子的父母等等。

有什么想法吗?怎么做? 我不确定是否有帮助,但这是相关的代码。

 HierarchyItem result = new HierarchyItem();

            var fullHierarchies = _entities.Hierarchies.Where(p => !p.Deleted).ToList();
            var hierarchiesResult = _entities.Hierarchies.Where(p => !p.Deleted && p.Name.Contains(searchTerm)).ToList();

            List<HierarchyItemWithParentAsHierarchyItem> itemsWithTrees = new List<HierarchyItemWithParentAsHierarchyItem>();

             var hierarchyTop = new HierarchyItemWithParentAsHierarchyItem
             {
                 HierarchyID = null,
                 label = "Organization",
                 Code = "0",
                 Path = string.Empty,
                 Level = 0,
                 Parent = null
             };

             foreach (var item in hierarchiesResult)
             {
                 var hierarchy = new HierarchyItemWithParentAsHierarchyItem
                 {
                     HierarchyID = item.HierarchyID,
                     label = item.Name,
                     Code = item.Code,
                     Path = string.Empty,
                     Level = item.Level.Value,
                 };
                 hierarchy.Parent.Add(GetParent(fullHierarchies, item, hierarchyTop));

                 itemsWithTrees.Add(hierarchy);
             }


private HierarchyItemWithParentAsHierarchyItem GetParent(List<CloudEntities.Hierarchy> fullHierarchies, CloudEntities.Hierarchy item, HierarchyItemWithParentAsHierarchyItem hierarchyTop)
    {
        try
        {
            HierarchyItemWithParentAsHierarchyItem tempHierarchyItem;
            CloudEntities.Hierarchy tempHierarchy = fullHierarchies.FirstOrDefault(x => x.HierarchyID == item.ParentID);

            if (tempHierarchy == null)
                return hierarchyTop;
            else
            {
                tempHierarchyItem = new HierarchyItemWithParentAsHierarchyItem()
                {
                    HierarchyID = tempHierarchy.HierarchyID,
                    label = tempHierarchy.Name,
                    Code = tempHierarchy.Code,
                    Path = string.Empty,
                    Level = tempHierarchy.Level.Value
                };
                tempHierarchyItem.Parent.Add(GetParent(fullHierarchies, tempHierarchy, hierarchyTop));
            }

            return tempHierarchyItem;
        }
        catch (Exception ex)
        {

        }
    }

0 个答案:

没有答案