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;
}
更新:添加了查找方法。您需要搜索整棵树
我有需要加载为树结构的学生列表。
以下是我的员工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;
}
更新:添加了查找方法。您需要搜索整棵树