Как удалить все элементы из вложенного списка во время итерации в C #

2

У меня есть вложенный список, который содержит

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 и удалить все элементы с именем "Джон"? Если имя - Джон, узел с именем Джон и все нижележащие подпункты должны быть удалены.

  • 0
    Не могли бы вы привести пример того, чего вы пытаетесь достичь.
  • 0
    это простая программа со списком ссылок, пожалуйста, проверьте ссылку, она может решить вашу проблему c-sharpcorner.com/article/linked-list-implementation-in-c-sharp
Показать ещё 7 комментариев
Теги:

4 ответа

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);
        }
    }
}
  • 0
    Это тоже удаляет нижележащее поддерево? Если у человека есть имя «Джон», то это лицо и все нижележащее поддерево должны быть удалены.
  • 0
    Вы имеете в виду его детей? Его дети снимаются вместе с человеком "Джон". Чтобы ответить на ваш вопрос: ДА.
2

Вам лучше не удалять элементы из существующей структуры, а вместо этого возвращать новую структуру без "Джона".

Вот как:

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

Если вы начнете с исходных данных:

var Persons = new List<Person>()
{
    new Person("Eric")
    {
        Childs = new List<Person>()
        {
            new Person("Tom"),
            new Person("John")
            {
                Childs = new List<Person>()
                {
                    new Person("Bill")
                }
            }
        }
    },
    new Person("John")
};

Теперь вы можете запустить это:

List<Person> PersonsNotJohn = Except(Persons, "John");

Это дает:

Изображение 174551

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

Ну вот.

Добавить пространство имен

using System.Linq;

Используйте ниже один лайнер

Persons.RemoveAll(x => x.Name == "John");
  • 0
    Что происходит, когда Джон ребенок? :)
  • 0
    Это не удаляет «внутреннего» Джона, только «внешнего».
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню