如何使用Linq打印列表中的列表

时间:2014-03-03 09:13:56

标签: c# linq

如何使用Linq打印出所有人及其宠物。我只想打印出有宠物的人。

首选结果如:

Kate Bed:
   Rex
   Sally

我的无效解决方案在这里:

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);
            }
        }

    }

我得到的是:

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

以下是了解我要问的内容的代码:

数据保存在这里:

 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;
        }
    }

人类:

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; }

}

宠物等级:

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; }
}

性别枚举:

public enum Sex{
    Man,
    Woman
}

3 个答案:

答案 0 :(得分:5)

foreach (var person in list)
{
    Console.WriteLine(person.Firstname + " " + person.Lastname + ":");

    foreach(var pet in person.Pets) // iterate over Pets of person
    {
        Console.WriteLine("   " + pet.Firstname); // write pet's name
    }
}

请记住 - 如果有人将null宠物添加到宠物收藏中或者有空宠物清单,您可能会遇到问题。因此,可能正确的查询以获取宠物的人是:

var peopleWithPets = from p in StaticGenator.getPersons()
                     where p.Pets != null &&
                           p.Pets.Any() &&
                           p.Pets.All(x => x != null)
                     select p;

还使用字符串格式:

foreach (var person in peopleWithPets)
{
    Console.WriteLine("{0} {1}:", person.Firstname, person.Lastname);

    foreach(var pet in person.Pets)        
        Console.WriteLine("\t{0}", pet.Firstname);        
}

另外,我建议您按照MicroSoft推荐的Capitalization Styles进行操作。

答案 1 :(得分:0)

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

应该是:

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

您必须遍历正在迭代的当前用户的宠物集合。

答案 2 :(得分:0)

假设您的数据结构有一些列表(上面提到过)

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 } } });

您可以使用这4行代码轻松过滤以及写入控制台

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));
});