Хорошо, в общем, вы должны понимать, что каждый "Персональный узел" имеет 4 отношения с другими Узлами Персоны, Родителями, Супругами, Детями и Братьями и сестрами (которые мы можем называть Родителями. Дети, исключая себя). Так что теперь мы можем перебрать всех родственников Узла Персоны, используя рекурсивный метод, который выглядит следующим образом:
public static bool contains<T>(List<T> main, T sub) {
foreach (T i in main) {
if (i.Equals(sub)) {
return true;
}
}
return false;
}
public static List<Person> relatives(Person person, List<Person> people) {
// Spouses -> Children -> Siblings -> Parents
// If Dead do not add to list but still iterate through
if (person.alive) {
people.Add(person);
}
// Spouces
if (person.spouses.Count > 0) {
foreach (Person spouse in person.spouses) {
if (spouse.alive) {
people.Add(spouse);
}
if (!contains<Person>(people, spouse)) people.AddRange(relatives(spouse, people));
}
}
// Children
if (person.children.Count > 0) {
foreach (Person child in person.children) {
if (child.alive) {
people.Add(child);
}
if (!contains<Person>(people, child)) people.AddRange(relatives(child, people));
}
}
// Parents
if (person.parents[0] != null && person.parents[1] != null) {
foreach (Person parent in person.parents) {
if (parent.alive) {
people.Add(parent);
}
if (!contains<Person>(people, parent)) people.AddRange(relatives(parent, people));
foreach (Person child in parent.children) {
if (child.alive) {
people.Add(child);
}
if (!contains<Person>(people, child)) people.AddRange(relatives(child, people));
}
}
}
List<Person> family = new List<Person>();
foreach (Person i in people) {
bool copy = false;
foreach (Person j in family) {
if (j == i) {
copy = true;
}
}
if (copy == false) {
family.Add(i);
}
}
return family;
}
}