Как мне получить пути до подразделений?

Рейтинг: 0Ответов: 1Опубликовано: 19.05.2023

У меня есть список подразделений:

var departments = await _departmentClient
    .Get( subjects.Select( subject => subject.Department.Id ) );

и список родителей:

var parentDepartments = await _departmentClient
    .GetByChildrenIds( subjects.Select( subject => subject.Department.Id ) );

мне нужно сгруппировать подразделения таким образом:

map[department]{parentDepartments}

т.е какой-то словарь, ключом которого, является подразделение-ребенок, а в значениях - родители, но я как-то не понимаю, как это сделать

я попытался сделать join:

from d in departments
join p in parentDepartments
on d.ParentDepartment?.Id equals p.Id into parentJoin
from parent in parentJoin
select new { Department = d, ParentDepartment = parent };

но проблема в том, что я смогу лишь получить одно подразделение-родителя, а остальные пропадут

наверное, как-то рекурсивно нужно, но я не понимаю. Подскажите, пожалуйста

Ответы

▲ 0Принят

Я сделал так, но может быть это не оптимально. Если есть идеи, предложите

var departments = await _departmentClient
   .Get( subjects.Select( subject => subject.Department.Id ) );

var parentDepartments = await _departmentClient
   .GetByChildrenIds( subjects.Select( subject => subject.Department.Id ) );

var concatDepartments = departments.Union( parentDepartments );
var tree = GetDepartmentsWithNested( concatDepartments.ToList() );

private Dictionary<string, string> GetDepartmentsWithNested( List<DepartmentDto> departments )
{
    var departmentsWithPaths = new Dictionary<string, string>();

    var departmentsDict = new Dictionary<string, DepartmentDto>();

    foreach ( var department in departments )
    {
        departmentsDict.TryAdd( department.Id, department );
    }

    foreach ( var department in departmentsDict )
    {
        if ( departmentsWithPaths.ContainsKey( department.Value.Id ) )
                continue;

        var path = department.Value.Title;
        var current = department.Value;

        while ( current.ParentDepartment?.Id != null )
        {
             path = current.ParentDepartment.Title + "/" + path;

             if ( !departmentsDict.ContainsKey( current.ParentDepartment.Id ) )
             {
                 departmentsWithPaths.TryAdd(
                    current.ParentDepartment.Id,
                    current.ParentDepartment.Title );
                 break;
             }

             current = departmentsDict[ current.ParentDepartment.Id ];
            }
         departmentsWithPaths.Add( department.Value.Id, path );
        }

    return departmentsWithPaths;
    }