Как напечатать список из списка вложенных классов - PullRequest
0 голосов
/ 17 января 2020

Мне нужно распечатать список вложенного класса Person. Свойство Siblings является списком класса Person. Это создает неизвестное число глубины.

Есть много вопросов и ответов до 3 уровней глубины. Моя ситуация другая.

   var Persons= new List<Person>();

         public class Person
            {
                public int ID { get; set; }
                public string Name { get; set; }
                public List<Person> Siblings { get; set; }
            }   


 var Persons = new List<Person>();
            foreach (var prsn in Persons)
            {
                Console.WriteLine(prsn.ID);

                foreach (var sibling in prsn.Siblings)
                {
                    Console.WriteLine(sibling.ID);
                    foreach (var sibling2 in prsn.Siblings)
                    {
                        Console.WriteLine(sibling2.ID);
                    }
                }

            }   

Ответы [ 4 ]

2 голосов
/ 17 января 2020

Если я хорошо понял проблему, это один из методов.

static void Main(string[] args)
    {
        List<Person> Persons = new List<Person>();
        foreach (Person person in Persons)
        {
            Console.WriteLine(person.Id);
            if (person.Siblings != null && person.Siblings.Count != 0)
            {
                List<Person> people = GetPersons(person.Siblings);
                foreach (Person person1 in people)
                    Console.WriteLine(person1.Id);
            }
        }
    }

private static List<Person> GetPersons(List<Person> sibling)
{
    List<Person> people = new List<Person>();
    foreach(Person person in sibling)
    {

        people.Add(person);
        if(person.Siblings != null && person.Siblings.Count!=0)
        {
            List<Person> people1 = GetPersons(person.Siblings);
            people.AddRange(people1);
        }
    }
    return people;
}
1 голос
/ 17 января 2020

Вы можете добавить в свой класс простой метод, который бы получал всех потомков:

public static void Main()
{
    var Persons = new List<Person>();
    foreach (var prsn in Persons)
    {
        Console.WriteLine(prsn.ID);

        foreach (var sibling in prsn.GetDescendantSibilings())
        {
            Console.WriteLine(sibling.ID);
        }

    }
    Console.ReadLine();
}

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<Person> Siblings { get; set; }

    public List<Person> GetDescendantSibilings()
    {
        var toReturn = new List<Person>(Siblings);
        foreach(var sib in Siblings)
        {
            toReturn.AddRange(sib.GetDescendantSibilings());
        }
        return toReturn;
    }
}
1 голос
/ 17 января 2020

Вы можете использовать алгоритм рекурсии

static void Print(List<Person> Persons)
        {
            if (Persons == null)
            {
                return;
            }
            for (int i = 0; i < Persons.Count; i++)
            {
                Console.WriteLine(Persons[i].ID);

                Print(Persons[i].Siblings);
            }
        }
1 голос
/ 17 января 2020

Я не совсем понял, что вы ищете.
Но я придумал кусок кода, чтобы решить проблему, которая, я думаю, у вас есть.

using System;
using System.Collections.Generic;

Я внес несколько изменений в ваш Person класс

public class Person
{
    public Person(string name)
    {
        Siblings = new List<Person>();
        Name = name;
    }
    public int ID { get; set; }
    public string Name { get; set; }
    public List<Person> Siblings { get; set; }
}

Затем, используя метод ForEach(), я смог напечатать список братьев и сестер для каждого человека в список.

var people = new List<Person>()
{
    new Person("Amanda"),
    new Person("Lucas"),
    new Person("George"),
};

var siblings = new List<Person>()
{
    new Person("Mari"),
    new Person("Vini"),
    new Person("Diego"),
};

foreach (var sibling in siblings)
{
    people.ForEach(p => p.Siblings.Add(sibling));
}

foreach (var person in people)
{
    person.Siblings.ForEach(s => Console.WriteLine($"{person.Name} has {s.Name} as sibling"));
}

Вывод был:

enter image description here

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...