Как мне получить пути до подразделений?
У меня есть список подразделений:
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 };
но проблема в том, что я смогу лишь получить одно подразделение-родителя, а остальные пропадут
наверное, как-то рекурсивно нужно, но я не понимаю. Подскажите, пожалуйста
Ответы (1 шт):
Автор решения: Anthony
→ Ссылка
Я сделал так, но может быть это не оптимально. Если есть идеи, предложите
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;
}