删除嵌套循环 (C#)(删除 Foreach 内部)

问题描述 投票:0回答:2

这是我的实体:

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的控制器怎么办? 谢谢大家的宝贵时间

c# linq foreach nested-loops
2个回答
0
投票

您可以直接创建一个副本并迭代它,同时从原始集合中删除项目,而不是修改正在迭代的集合。

或者更简单:

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

这将查询至少有一个

Action
不是
Active
的所有控制器,并将结果存储在
p.Controllers
属性中。


0
投票

您无法修改您所选择的集合。 如果您不想制作副本/运行额外的循环,您可以利用您拥有带有索引的列表的事实:

for (int i = 0; i < ListOfPermision.Count; i++) {
    for (int j = 0; j < ListOfPermision[i].controllers.Count; j++) {
        if (ListOfPermision[i].controllers[j].actions.Any(a => !a.Active)) {
            ListOfPermision[i].controllers.RemoveAt(j);
            j--;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.