Удалить данные из вложенного списка

#c# #list

Вопрос:

Я создал этот пример проекта, в котором я пытаюсь удалить дополнительные данные с помощью Where и Any , но он все еще содержит данные. Он должен удалить заметки DD и просто сохранить заметки CC.

Любая помощь в этом была бы отличной.

 TemplateNote = TemplateNote.Where(x =>
    x.Content == "AA" amp;amp;
    x.Conditions.Any(v => v.Target != removeAgentDisease)
).ToList();
 

https://dotnetfiddle.net/a3d6Py

текущий выходной сигнал включает примечания DD

 TemplateNote AA
TemplateNoteCondition CC
TemplateNoteCondition DD
 

Должно быть так без DD

 TemplateNote AA
TemplateNoteCondition CC
 

Ответ №1:

Вы удаляетесь из родительского списка, а не из дочернего списка. Поэтому вам нужно создать копию — TemplateNoteModel с новым дочерним списком, который содержит только нужные элементы:

 TemplateNote = TemplateNote
    .Select(tn => new TemplateNoteModel
    {
        Conditions = tn.Conditions
           .Where(c => c.Target != removeAgentDisease)
           .ToList(),
        Content = tn.Content,
        Id = tn.Id
    })
    .Where(x => x.Conditions.Any()) // i guess you don't want empty condtions
    .ToList();
 

Ваша модифицированная скрипка: https://dotnetfiddle.net/yduh5o

Комментарии:

1. Можно ли в любом случае сделать это без создания модели copy-TemplateNoteModel?

2. @Джефферсон: Да, вам нужно использовать цикл TemplateNote и изменять каждый TemplateNoteModel из них с помощью запроса, показанного в моем ответе. Поэтому вместо TemplateNote=TemplateNote.Select(...) того, чтобы просто изменять Conditions свойство в цикле: tn.Conditions=tn.Conditions.Where(c => c.Target != removeAgentDisease).ToList(); . Поэтому вы просто заново создаете (дополнительный)список. Имейте в виду, что при таком подходе вы не удаляете списки пустых условий.

3. Извините, а что, если я тоже захочу удалить родителя ?

4. с условиями удаления агента

5. Если вы хотите удалить все родители, которые имеют только removeAgentDisease-условия и петли подход нужен второй (результат)список, что вы заполняете из цикла: dotnetfiddle.net/GdrXzB если необходимо сохранить исходный список, вы можете либо повторно присвоить результат-список в первоначальном списке или вам нужен второй цикл, в котором вы удалите элементы из первого списка, которые не входят в список результатов. Вы можете использовать list.RemoveAll