JSON 员工树视图

JSON for tree view of employees

我有需要加载为树结构的学生列表。

以下是我的员工class

public class Employee
    {
        public Guid Id { get; set; }

        public Guid ParentId { get; set; }

        public string Name { get; set; }

        public bool IsDefault { get; set; }

        public int Order { get; set; }
    }

这是我要向用户显示的树视图class

public class Tree
    {
        public Guid Id { get; set; }
        public string Name { get; set; }

        public bool isSelected { get; set; }

        public List<Tree> children { get; set; }

    }

根据员工列表,json 应该显示如下内容

下面的代码为我提供了每个父 ID 的副本,但没有给出预期的结果。

var groupedUsers = result.GroupBy(t=>t.ParentId).SelectMany(t=>t.ToList());
            foreach (var item in groupedUsers)
            {

                if (item.ParentId == Guid.Empty)
                {
                    treeData.Add(new Tree()
                    {
                        Id = item.Id,
                        children = new List<Tree>(),
                        isSelected = item.IsDefault,
                        Name = item.Name
                    });
                }
                else
                {
                    var parent = treeData.FirstOrDefault(t => t.Id == item.ParentId);
                    if (parent != null)
                    {
                        parent.children.Add(new Tree()
                        {
                            Id = item.Id,
                            children = new List<Tree>(),
                            isSelected = item.IsDefault,
                            Name = item.Name
                        });
                        treeData.Add(parent);
                    }


                }
            }

更新:有了罗伯特的回答,我可以开始了,但它仍然是重复的 结尾 json 可以在这里找到 Tree JSON 所以我将代码更新为类似这样的代码以消除重复项。但它不起作用我想我在递归中遗漏了一些东西?

static void Main(string[] args)
        {

            var text = File.ReadAllText(@"C:\Users\Dinesh\source\repos\Tests\Tests\Employee.json");
            var result = JsonConvert.DeserializeObject<List<Employee>>(text);


            var groupedUsers = result.GroupBy(t => t.ParentId).SelectMany(t => t.ToList()).OrderBy(t=>t.Order).ToList();



            foreach (var item in groupedUsers)
            {
                AddEmployee(item, null, groupedUsers, treeData);

            }
        }


        static Tree AddEmployee(Employee parentEmployee, Employee childEmployee, List<Employee> groupedUsers, List<Tree> newTreeData)
        {

            if (parentEmployee.ParentId == Guid.Empty)
            {
                var root = new Tree()
                {
                    Id = parentEmployee.Id,
                    children = new List<Tree>(),
                    isSelected = parentEmployee.IsDefault,
                    Name = parentEmployee.Name
                };
                treeData.Add(root);
                return root;
            }
            else
            {
                var parent = treeData.FirstOrDefault(t => t.Id == parentEmployee.ParentId);
                if (parent == null)
                {
                    var parentItem = groupedUsers.Single(x => x.Id == parentEmployee.ParentId);
                    var currentTree = newTreeData.SelectMany(t => t.children).Where(y => y.Id == parentEmployee.ParentId).ToList();
                    parent = AddEmployee(parentItem, parentEmployee, groupedUsers, currentTree);
                }
                if (childEmployee != null)
                {
                    var childsParent = newTreeData.Where(y=>y.Id == childEmployee.ParentId).First();
                    return childsParent;

                }
                var child = newTreeData.FirstOrDefault(t => t.Id == parentEmployee.Id);
                if (child != null)
                    return child;
                child = new Tree()
                {
                    Id = parentEmployee.Id,
                    children = new List<Tree>(),
                    isSelected = parentEmployee.IsDefault,
                    Name = parentEmployee.Name
                };
                parent.children.Add(child);
                return child;

            }

        }

因为评论中的格式更好。

您的行 treeData.Add(parent); 总是添加项目 - 不管是否已经添加。

var parent = treeData.FirstOrDefault(t => t.Id == item.ParentId);
if (parent != null)
{
    parent.children.Add(new Tree()
    {
        Id = item.Id,
        children = new List<Tree>(),
        isSelected = item.IsDefault,
        Name = item.Name
    });
    // do not add the parent again here
}
else 
{
    // add the parent only if was not found above
    // TODO parent = new Tree(...);
    treeData.Add(parent);
}

更新:我认为你应该使用循环。如果找不到 parent,您可以松开 children。 一些草稿可能如下所示:

var treeData = new List<Tree>();

var groupedUsers = result.GroupBy(t => t.ParentId).SelectMany(t => t.ToList());

foreach (var item in groupedUsers)
{
    AddEmployee(item);
}

Tree AddEmployee(dynamic item) 
{

    if (item.ParentId == Guid.Empty)
    {
        var root = new Tree()
        {
            Id = item.Id,
            children = new List<Tree>(),
            isSelected = item.IsDefault,
            Name = item.Name
        };
        treeData.Add(root);         
        return root;
    }
    else
    {
        var parent = Find(item.ParentId, treeData);
        if (parent == null)
        {               
            var parentItem = groupedUsers.Single(x => x.Id == item.ParentId);
            parent = AddEmployee(parentItem );              
        }

        var child = Find(item.Id, treeData);
        if (child != null)
           return child;
        child = new Tree()
        {
            Id = item.Id,
            children = new List<Tree>(),
            isSelected = item.IsDefault,
            Name = item.Name
        };
        parent.children.Add(child );            
        return child;

    }       
}
Tree Find(Guid item, List<Tree> tree)
{
    var parent = tree?.FirstOrDefault(t => t.Id == item);
    if (parent != null)
    {
        return parent;
    }
    if (tree != null)
    {           
        foreach(var t in tree)
        {
           parent = Find(item, t?.children);
           if (parent != null)
               return parent;
        }
    }
    return null;        
}

更新:添加了查找方法。您需要搜索整棵树