'How to print list inside of list using Linq

How to print out all the persons and their pets, using Linq. I only want to print out persons who have pets.

Prefer result be like:

Kate Bed:
   Rex
   Sally

My not working solution is here:

class Program
{
    static void Main(string[] args)
    {
        result();
    }
static void result() {    

        var list = StaticGenator.getPersons().Where(x => x.Pets != null);
        foreach (var person in list)
        {
            Console.WriteLine(person.Firstname + " " + person.Lastname + ":");
            foreach(var pet in list){
                Console.WriteLine("   " + pet.Pets);
            }
        }

    }

What i get is:

    Kate Bed: 
       system.collection.generic.list'1[MainLibrary.Pet]
       system.collection.generic.list'1[MainLibrary.Pet]

Here is the code to understand what I am asking:

Data is held here:

 public static class StaticGenator
    {
        public static List<Person> getPersons()
        {
            List<Person> persons = new List<Person>();
            persons.Add(new Person() { Firstname = "Sam", Lastname = "Car", BirthDate = new DateTime(2001, 01, 01), PersonId = 1, Sex = Sex.Man });
            persons.Add(new Person() { Firstname = "Kate", Lastname = "Bed", BirthDate = new DateTime(1995, 11, 11), PersonId = 2, Sex = Sex.Woman, Pets = new List<Pet>() { new Pet { Firstname = "Rex", BirthDate = new DateTime(2007, 1, 1), Sex = Sex.Man, PetId = 1 }, new Pet { Firstname = "Sally", BirthDate = new DateTime(2004, 2, 1), Sex = Sex.Woman, PetId = 2 } } });
            return  persons;
        }
    }

Person Class:

public class Person
{
    public int PersonId { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public DateTime BirthDate { get; set; }
    public Sex Sex{ get; set; }
    public int Age { 
        get 
        {
            var age= DateTime.Now.Year - BirthDate.Year;
            if (DateTime.Now.Day >= BirthDate.Day && DateTime.Now.Month >= BirthDate.Month)
                return age;
            else
                return age- 1;
        }      
    }
    public List<Pet> Pets { get; set; }

}

Pet Class:

public class Pet 
{
    public int PetId { get; set; }
    public String Firstname { get; set; }
    public Sex Sex { get; set; }
    public DateTime BirthDate { get; set; }
    public int Age { get; set; }
}

Sex enum:

public enum Sex{
    Man,
    Woman
}


Solution 1:[1]

foreach(var pet in list)
{
    Console.WriteLine("   " + pet.Pets);
}

Should be:

foreach(var pet in person.Pets)
{
    Console.WriteLine("   " + pet.FirstName);
}

You have to iterate over the pet collection of the current user that is being iterated.

Solution 2:[2]

Suppose you have some list (you mentioned above) with your datastructure

List<Person> persons = new List<Person>();
    persons.Add(new Person() { Firstname = "Sam", Lastname = "Car", BirthDate = new DateTime(2001, 01, 01), PersonId = 1, Sex = Sex.Man });
    persons.Add(new Person() { Firstname = "Kate", Lastname = "Bed", BirthDate = new DateTime(1995, 11, 11), PersonId = 2, Sex = Sex.Woman, Pets = new List<Pet>() { new Pet { Firstname = "Rex", BirthDate = new DateTime(2007, 1, 1), Sex = Sex.Man, PetId = 1 }, new Pet { Firstname = "Sally", BirthDate = new DateTime(2004, 2, 1), Sex = Sex.Woman, PetId = 2 } } });

You can very easily filter as well as write to console with these 4 lines of code

persons.Where(p => p.Pets != null && p.Pets.Any()).ToList().ForEach(p =>
{
    Console.WriteLine(p.Firstname + " " + p.Lastname + "\n");
    p.Pets.ForEach(pt => Console.WriteLine(pt.Firstname));
});

Solution 3:[3]

        var output = String.Join("\n", persons.Select(person => $"{person.Firstname} {person.Lastname}"));

Output: Sam Car Kate Bed

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Abbas
Solution 2
Solution 3