Удалить во вложенных циклах (удалить внутри foreach)

Это мои сущности:

public class Permissions
{
    public string PermissionName { get; set; }
    public List<Controllers> controllers { get; set; }
}
public class Controllers
{
    public string ControllerName { get; set; }
    public List<Actions> actions { get; set; }
}
public class Actions
{
    public string ActionName { get; set; }
    public bool Active { get; set; }
}

Я хочу удалить контроллеры с действиями DeActive...

    var a1 = new Actions() { ActionName = "Action1", Active = false };
    var a2 = new Actions() { ActionName = "Action2", Active = true };
    var a3 = new Actions() { ActionName = "Action3", Active = true };
    var a4 = new Actions() { ActionName = "Action4", Active = true };

    var c1 = new Controllers() { ControllerName = "Controller1", actions = new List<Actions>() { a1, a2 } };
    var c2 = new Controllers() { ControllerName = "Controller2", actions = new List<Actions>() { a3, a4 } };

    var ListOfPermision = new List<Permissions>()
    {
         new Permissions() { PermissionName = "P1", controllers = new List<Controllers>() { c1, c2 } }
    };
    //First Way:-------------------------------
    ListOfPermision.ForEach(p =>
      p.controllers.ForEach(c =>
          c.actions.ForEach(a =>
          {
              if (!a.Active)
              {
                  //Remove Controller
              }
          }
     )));
    //OR Second Way:----------------------------
    foreach (var p in ListOfPermision)
    {
        foreach (var c in p.controllers)
        {
            foreach (var a in c.actions)
            {
                if (!a.Active)
                {
                    //Remove Controller
                }
            }
        }
    }
    //----------------------------------

Следующий оператор должен удалить некоторые контроллеры, поскольку эти контроллеры имеют хотя бы одно действие с Active=False... Я не знаю, что мне лучше всего сделать... Что делать, если я хочу удалить контроллер, счетчик действий которого равен 0? Спасибо, ребята, за ваше время

вместо того, чтобы изменять коллекцию, которую вы повторяете, вы можете просто создать копию и выполнить ее, удаляя элементы из оригинала. В любом случае: как именно вы удаляете элементы? В вашем вопросе отсутствует код.

MakePeaceGreatAgain 02.07.2024 11:49
for цикл от конца к началу может помочь.
Alexander Petrov 02.07.2024 12:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

вместо того, чтобы изменять коллекцию, которую вы повторяете, вы можете просто создать копию и выполнить ее, удаляя элементы из оригинала.

Или еще проще:

foreach (var p in ListOfPermision)
{
    p.Controllers = p.Controllers.Where(x => x.Actions.Any(y => !y.Active)).ToList();
}

это запросит все контроллеры, где хотя бы один Action не является Active, и сохранит результат в свойстве p.Controllers.

Вы также можете использовать RemoveAll для List<T>, который ожидает Predicate<T>:

p.Controllers.RemoveAll(x => x.Actions.Any(y => !y.Active));

или когда вы хотите удалить все контроллеры, у которых нет Action:

p.Controllers.RemoveAll(x => !x.Actions.Any());

возможно, отметьте, что RemoveAll — это не IEnumerable<T>, а List<T> метод, который обходит исходную проблему

Ivan Petrov 02.07.2024 12:04

Код @IvanPetrov OP в любом случае примерно List<T>, но я добавляю эту информацию.

MakePeaceGreatAgain 02.07.2024 12:08

возможно также добавить, что RemoveAll не создает копию, как более общий подход LINQ.

Ivan Petrov 02.07.2024 12:18

Другие вопросы по теме