C# 如何将值从嵌套列表复制到新列表中

C# 如何将值从嵌套列表复制到新列表中,c#,C#,我有一个嵌套列表,其中包含 public class Person { public Person(string name) { this.Name = name; } public string Name { get; set; } public List<Person> Childs { get; set; } } 该列表的使用方式如下: var Persons = new List<Person>();

我有一个嵌套列表,其中包含

public class Person
{
    public Person(string name)
    {
        this.Name = name;
    }

    public string Name { get; set; }

    public List<Person> Childs { get; set; }
}
该列表的使用方式如下:

var Persons = new List<Person>();
Persons.Add(new Person("Eric"));
Persons[0].Childs = new List<Person>();
Persons[0].Childs.Add(new Person("Tom"));
Persons[0].Childs.Add(new Person("John"));
Persons[0].Childs[0].Childs = new List<Person>();
Persons[0].Childs[0].Childs.Add(new Person("Bill"));
Persons.Add(new Person("John");
现在我有一节课:

public class Human
{
    public string Name { get; set; }

    public int Age { get; set; }

    public List<Human> SubHuman { get; set; }
}

假设创建了人员列表。我现在如何从人员列表中创建一个新的列表?如果每个人的名字都是合适的人的名字,我如何在列表中迭代?它也应该像人一样嵌套,所有人都应该有12岁。

如果我理解正确,人和人只有共同的属性。。。我只看到手动将一个类实例映射到另一个类实例的方法

期望亚人类,分别。孩子们可能很深,我选择了递归解决方案

这里有一个例子:

    static Human Convert(Person p)
    {
        var result = new Human() { Name = p.Name, Age = 12 };
        if (p.Childs?.Any() == true)
        {
            result.SubHuman = new List<Human>();
            p.Childs.ForEach(x => result.SubHuman.Add(Convert(x))); //Recursion here
        }
        return result;
    }
这可以通过以下方式调用:

 List<Human> humans = Persons.Select(x => Convert(x)).ToList();
编辑:我认为这不是一个可持续的方法。根据要执行此操作的位置,我建议将公共接口设置为一个/或继承

private static List<Human> Convert(List<Person> persons)
{
    List<Human> humans = new List<Human>();
    foreach (Person p in persons)
    {
        Human newHuman = new Human(p.Name, 12);
        if (p.Childs != null)
        {
            newHuman.SubHuman = convert(p.Childs);
        }
        humans.Add(newHuman);
    }
    return humans;
}
在您的示例中,这样使用它:

var Humans = Convert(Persons);

您正在将一个实体映射到另一个实体,并且由于您在那里有一个树结构/嵌套,这可能是无限的,您可以使用递归,但必须小心-在我看来,真正无限的嵌套将导致堆栈溢出

鉴于此示例列表:

List<Person> people = new List<Person> {
  new Person("Tom")
  {
    Childs = new List<Person> {
        new Person("Maria"),
        new Person("Jonathan") {
            Childs = new List<Person> {
                new Person("Frank")
            }
        }
    }
  },
  new Person("Ila")
};
这个局部功能:

Human Extract(Person guy) 
{
    return new Human { Name = guy.Name, Age = 12, SubHuman = guy.Childs?.Select(Extract).ToList() ?? new List<Human>() };
}
然后,可以使用单个表达式映射原始列表:

List<Human> humans = people.Select(Extract).ToList();

那么一个孩子对应一个亚人类?您的子项列表嵌套有多深?所有三个等级的人->孩子->孩子或者是任意的世代数?这可能会帮助你@himbrombeer,因为等级数不是固定的。可能是1000级。我想要一个像人一样嵌套的人的列表,并包含人的名字。很好的解决方案+1它不是真正的无限。我试图弄清楚嵌套元素的级别是无法预测的。
List<Human> humans = people.Select(Extract).ToList();