这些是我的实体:
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; }
}
我想删除具有停用操作的控制器...
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的控制器怎么办? 谢谢大家的宝贵时间
您可以直接创建一个副本并迭代它,同时从原始集合中删除项目,而不是修改正在迭代的集合。
或者更简单:
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());