如何在C#中迭代时从嵌套列表中删除所有项目

时间:2019-02-20 11:10:06

标签: 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>();
    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");

如何遍历列表Persons并删除名称为“ John”的所有项目?如果名称为John,则应删除名称为John和所有底层子项的节点。

4 个答案:

答案 0 :(得分:2)

最好不要从现有结构中删除元素,而是返回没有“ John”的新结构。

方法如下:

map

如果您从原始数据开始:

_parse_SE

您现在可以运行:

List<Person> Except(List<Person> people, string name) =>
    people
        .Where(p => p.Name != name)
        .Select(p => new Person(p.Name)
        {
            Childs = Except(p.Childs ?? new List<Person>(), name) // Case typo in method name
        })
        .ToList();

给出:

PersonsNotJohn

答案 1 :(得分:0)

这是一种递归方法,它删除具有指定名称的所有人员。您可以像RemoveAllWithName(Persons, "John");这样称呼它。

private void RemoveAllWithName(List<Person> people, string name)
{
    for(int i = people.Count - 1; i >= 0; --i) {
        Person person = people[i];
        if(person.Name == name) {
            people.RemoveAt(i);
        } else if(person.Childs != null) {
            RemoveAllWithName(person.Childs, name);
        }
    }
}

答案 2 :(得分:0)

你在这里。

添加命名空间

using System.Linq;

使用下面的一根衬纸

Persons.RemoveAll(x => x.Name == "John");

答案 3 :(得分:0)

static void Main(string[] args)
    {
        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"));
        RemoveAllWithName("John", Persons);
        Persons.ForEach(x=>Print(x));
    }
    private static void RemoveAllWithName(string name, List<Person> persons)
    {
        if (persons != null && persons.Any())
        {
            persons.RemoveAll(x => x.Name == name);
        }
        if (persons != null && persons.Any())
        {
            persons.ForEach(x => RemoveAllWithName(name, x.Childs));
        }
    }
    private static void Print(Person person)
    {
        if (person != null)
        {
            Console.WriteLine(person.Name);
            person.Childs?.ForEach(Print);
        }
    }