你好,我试图弄清楚如何做到这一点。我有一个人员集合,每个人都可以向另一个人报告,或者他可以不向任何人报告(空),例如,我想说的话我想编辑一个他要向其报告的人。在图像中,我要编辑人(4),我想返回一个可以分配给他的员工列表(绿色),并排除他不能分配给的员工列表(标记为x红色)。
我曾尝试创建不同的列表,并在每次检查中循环查看报告所指向的列表是否具有任何价值,但我觉得这很杂乱,不具备在所选人员以下搜索两个以上级别的灵活性。
public async Task<IEnumerable<Person>> GetAllEmployeesThatCanBeReportedToAsync(int currentPersonid)
{
bool DoesAnyPersonReportToHim = context.HR_Emp_EmploymentDetails.Where(p => p.ReportsTo == currentPersonid).Any();
List<Person> ListofPersonstoexclude = new List<Person>();
//If No one reports to Him.
//returm All (Except Current)
if (DoesAnyPersonReportToHim == false)
{
var result = context.Persons.Where(p => p.PersonId != currentPersonid).ToListAsync();
return await result;
}
//If some Persons reports to Him.
//returm All Persons (Except Current)
//And (Except Persons that Report to Him) and (Except Persons that Report to Persons that Report to Him)..est.
else
{
//find Persons that report to him.
List<Person> LevelOneThatReportToHim =
context.Person.Where(p => p.ReportsTo == currentPersonid).ToList();
List<Person> LevelTwo = new List<Person>();
ListofPersonstoexclude.AddRange(LevelOneThatReportToHim);
foreach (var item in LevelOneThatReportToHim)
{
if (context.Persons.Where(p => p.ReportsTo == item.HR_Emp_EmploymentDetailId).Any())
{
var Person = context.Persons.SingleOrDefault(p => p.ReportsTo == item.PersonId);
LevelTwo.Add(Person);
ListofPersonstoexclude.Add(Person);
}
}
if (LevelTwo.Any())
{
foreach (var item in LevelTwo)
{
if (context.Persons.Where(p => p.ReportsTo == item.PersonId).Any())
{
var Person = context.Persons.SingleOrDefault(p => p.ReportsTo == item.PersonId);
ListofPersonstoexclude.Add(Person);
}
}
}
List<Person> result = context.Persons
.Where(p => p.PersonId != currentPersonid).ToList();
foreach (var Person1 in ListofPersonstoexclude)
{
result.RemoveAll(Person2 => Person2.PersonId == Person1.PersonId);
}
return result;
}
}
由于您要求逻辑,所以伪代码就足够了:
CanBeAssignedTo( root, assignee ):
if root is empty or root == assignee:
return []
result = [root]
Foreach child of root:
append CanBeAssignedTo(child,assignee) to result
return result