Уже много обсуждается порядок выполнения вашего кода, поэтому я не буду это комментировать. Ответ Aasmund Eldhuset мне кажется правильным.
Возможно, вы хотите что-то вроде этого, которое O(n)
:
void AssignChildrenAndParent(IEnumerable<Group> groups)
{
var groupById=new Dictionary<GroupId,Group>();
foreach(Group group in groups)
{
groupById.Add(group.Id,group);
}
foreach(Group group in groups)
{
Group parent=groupsById(group.ParentId);
group.Parent=parent;
parent.Children.Add(group);
}
}
Это немного отличается от исходного кода, поскольку исправляет все родительско-дочерние отношения, а не только те, которые находятся ниже корня.
Или, если вы действительно хотите код, который ведет себя точно так же, как ваш исходный код (еще раз O (n), если хеши работают хорошо):
private void AddChildren(Group group, IEnumerable<Group> groups)
{
var children=groups.ToLookup(group=>group.ParentId);
AddChildren(group, groups, lookup);
}
private void AddChildren(Group group, IEnumerable<Group> groups,Lookup<GroupId,Group> lookup)
{
foreach (var g in lookup[group.Id])
{
g.Parent = group;
group.Children.Add(g);
AddChildren(g, groups,lookup);
}
}