【问题标题】:How to copy values from nested list into new list如何将嵌套列表中的值复制到新列表中
【发布时间】:2019-03-01 07:32:04
【问题描述】:

我有一个包含

的嵌套列表
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; }
}

假设 Persons 列表已创建。我现在如何从 Persons 列表中创建一个新列表 Humans(遍历列表),而每个 Human 的名字都是相应 Person 的名字?它也应该像 Persons 一样嵌套,并且所有 Humans 都应该有 12 岁。

【问题讨论】:

  • 所以 Child 对应 SubHuman ?你的孩子列表嵌套有多深?总是3级(人-->孩子-->孩子)还是世代数是任意的?
  • @HimBromBeere 级别数不固定。它可能是1000个级别。我想要一个列表 Humans,它像 Persons 一样嵌套,并包含 Nameof Persons

标签: c#


【解决方案1】:
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;
}

我还在Human 类中添加了一个构造函数。

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

    public int Age { get; set; }

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

    public Human(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

在您的示例中像这样使用它:

var Humans = Convert(Persons);

【讨论】:

    【解决方案2】:

    如果我理解正确的话,Human 和 Person 只是有共同的属性...我只看到一种将一个类实例映射到另一个类实例的“手动”方式。

    期待SubHuman,resp。孩子可能很深,我选择了递归解决方案。

    这里是一个例子:

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

    编辑:我认为这不是一种可持续的方法。根据执行此操作的设置,我建议创建通用接口和/或继承。

    【讨论】:

      【解决方案3】:

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

      鉴于此示例列表:

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

      【讨论】:

      • 它并不是真正的无限。我试图说明嵌套元素的级别无法预测。
      猜你喜欢
      • 2020-10-15
      • 2021-01-23
      • 2021-01-26
      • 2013-12-05
      • 2017-06-17
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多