У меня проблемы с созданием генеалогического дерева в c# - PullRequest
0 голосов
/ 10 марта 2020

Вот что у меня есть, человек, занимающийся с родителями и детьми. Я хочу создать метод, который создает словарь с родственниками человека и его "близостью" к любому человеку, используя то, насколько тесно они связаны с предметом. Чего я не понимаю, так это того, как я должен проходить через все человека в ситуации, когда у него были живые родители и дети, вот куда вы приходите, как мне сделать эту новую итерацию вверх-вниз. В любом случае вот код, который у меня есть.

using System;
using System.Collections.Generic;

namespace familytree{

    public static Random rand = new Random();

    public class Program{

        public static void main(string[] args){


        }

        public static void relatives(Person subject){
            // help

        }

    }



    public class Person{

        public readonly bool gender;
        public string firstname;
        public string lastname;
        public Person[] parents = new Person[2];
        public List<Person> children = new List<Person>();

        public Person(Person mother, Person father){

            this.gender = rand.NextDouble() >= 0.5;
            this.parents[0] = mother;
            this.parents[1] = father;
            this.firstname = "firstname";
            this.lastname = father.lastname + " - " + mother.lastname;

        }
    }

}

1 Ответ

0 голосов
/ 15 марта 2020

Хорошо, в общем, вы должны понимать, что каждый "Персональный узел" имеет 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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...