Как найти значение в дереве?
У меня есть DepartmentDigestDto, выглядит так:
public class DepartmentDigestDto
{
[JsonProperty( PropertyName = "id" )]
[JsonRequired]
public string Id { get; set; }
[JsonProperty( PropertyName = "title" )]
public string Title { get; set; }
[JsonProperty( PropertyName = "parent_department_id" )]
public string ParentDepartmentId { get; set; }
}
Это один из возвращаемых объектов метода List:
var departments = ( await _departmentClient.List().Unwrap() ).Items;
Мне на вход отдают id, а я должен найти в департаментах путь до этого id, т.е как-то так: Office/firstRoom/etc.. (где названия - это Title) Мне показалось, что можно преобразовать в дерево, поэтому сделал следующее:
static internal class Extensions
{
static public IEnumerable<ExtensionTreeItem<T>> GenerateTree<T, K>(
this IEnumerable<T> collection,
Func<T, K> idSelector,
Func<T, K> parentIdSelector,
K rootId = default( K ) )
{
foreach ( var item in collection
.Where( item => EqualityComparer<K>.Default
.Equals( parentIdSelector( item ), rootId ) ) )
{
yield return new ExtensionTreeItem<T>
{
Item = item,
Children = collection.GenerateTree(
idSelector,
parentIdSelector,
idSelector( item ) )
};
}
}
}
internal class ExtensionTreeItem<T>
{
public T Item { get; set; }
public IEnumerable<ExtensionTreeItem<T>> Children { get; set; }
}
А потом это вызывается вот таким образом:
var departmentsTree = departments
.GenerateTree(
department => department.Id,
department => department.ParentDepartmentId )
.ToDictionary( x => ( x.Item.Id, x.Item.Title), x => x.Children );
Получается, что ключом в словаре, является самое начало пути, а конец где-то в value находится. Вопрос: как получить этот путь?