Это мои сущности:
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? Спасибо, ребята, за ваше время
for
цикл от конца к началу может помочь.
вместо того, чтобы изменять коллекцию, которую вы повторяете, вы можете просто создать копию и выполнить ее, удаляя элементы из оригинала.
Или еще проще:
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>
метод, который обходит исходную проблему
Код @IvanPetrov OP в любом случае примерно List<T>
, но я добавляю эту информацию.
возможно также добавить, что RemoveAll
не создает копию, как более общий подход LINQ.
вместо того, чтобы изменять коллекцию, которую вы повторяете, вы можете просто создать копию и выполнить ее, удаляя элементы из оригинала. В любом случае: как именно вы удаляете элементы? В вашем вопросе отсутствует код.