So I have a tree of people with children and I only want to get the people with cars. if a child has a car but the parent does not, I want to keep the parent in the tree.
I thought the best way would be to use a recursive function, that looked like this:
private Person CheckPerson(Person person)
{
List<Person> removeList = new List<Person>();
foreach (Person child in Person.Children)
{
if (CheckPerson(child) == null)
{
// I can't remove the children here because
// they are used in the foreach loop
removeList.Add(child);
}
}
foreach (Person removable in removeList)
{
Person.Children.Remove(removable);
}
if (person.Children.Count() > 0)
{
return person;
}
else if (person.cars.Count() > 0)
{
return person;
}
else
{
return null;
}
}
but this way I do change the parameter person, I remove his children.
The other ways I tried are as below.
- return void
- return bool
- ref parameter
I also tried doing it without a return value and just looking back at the input person for the result, but this didn't save the changes.
Returning a bool to determine if a child should be removed worked, but the original method call did not have any use for the bool. So the method had side effects since Person -> bool, but I still changed the person
using a ref parameter I wasn't able to compile because I remove the children and there for changing the object in my foreach loop.
So I'm wondering what the best way would be to use a recursive method with the least side effects, or what the best practice would be?
If you only need a Test whether a car is available you could use this:
But I think you should return an
IEnumerable<Person>
that contains all persons that have a car (or one child has a car).Maybe is could look like this: