同一集合中的排序逻辑

问题描述 投票:0回答:1

enter image description here

你好,我试图弄清楚如何做到这一点。我有一个人员集合,每个人都可以向另一个人报告,或者他可以不向任何人报告(空),例如,我想说的话我想编辑一个他要向其报告的人。在图像中,我要编辑人(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;
        }



    }
c#
1个回答
0
投票

由于您要求逻辑,所以伪代码就足够了:

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
© www.soinside.com 2019 - 2024. All rights reserved.