我有一个包含
的嵌套列表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和所有底层子项的节点。
答案 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();
给出:
答案 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);
}
}