【问题标题】:edit list inside foreach loop在 foreach 循环中编辑列表
【发布时间】:2010-12-01 23:45:29
【问题描述】:

我有一个具有以下结构的对象:(伪代码)

class Client
{
- int ID
- int? ParentID
- string Name
- datetime CreateDate
- int ACClientID
- List <Client> Clients }

我想使用递归 foreach 遍历整个嵌套结构,将 ALL 的 ACClientID 设置为一个值。

我知道 foreach 中的枚举数是不可变的,因此以下内容不起作用:

 private static bool AssignToChildren(ref ATBusiness.Objects.Client client, int ACClientID)
        {
            client.ACClientID = ACClientID;

            foreach (ATBusiness.Objects.Client child in client.Clients)
            {
                AssignToChildren(ref child, ACClientID);
            }
        }

实现我的目标最有效的方法是什么?

PS:我不会在结构中添加或删除,只是为每个嵌套的 Client 对象设置一个属性。

[编辑] 我查看了What is the best way to modify a list in a 'foreach' loop?,但它没有为我提供所需的答案。

【问题讨论】:

    标签: c# foreach ref


    【解决方案1】:

    我可以为此推荐一个特定的属性吗?

    class Client
    {
        public Client()
        {
            Clients = new List<Client>();
        }
    
        public List<Client> Clients { get; private set; }
    
        private int aCClientID;
    
        public int ACClientID
        {
            get { return aCClientID; }
            set { aCClientID = value; }
        }
    
        public int ACClientIDRecursive
        {
            get
            {
                return aCClientID;
            }
            set
            {
                aCClientID = value;
                foreach (var c in Clients)
                {
                    c.ACClientIDRecursive = value;
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:
          private static bool AssignToChildren(ATBusiness.Objects.Client client, int ACClientID)
          {
              client.ACClientID = ACClientID;
      
              foreach (ATBusiness.Objects.Client child in client.Clients)
              {
                  AssignToChildren(child, ACClientID);
              }
          }
      

      【讨论】:

        【解决方案3】:

        由于您从未分配给参数client,因此您无需使用ref 传递它。

        由于您自己没有修改List&lt;T&gt; 对象,因此即使在枚举期间也没有理由不能修改 ACCClientID 属性。只有当您尝试篡改枚举背后的列表成员资格时,您才会收到异常。

        【讨论】:

          【解决方案4】:

          试试这个:

          private static bool AssignToChildren(ref ATBusiness.Objects.Client client, int ACClientID)
          {
            client.ACClientID = ACClientID;
            for (int i = client.Clients.Count - 1; i >= 0; i--) 
            {
              AssignToChildren(ref client.Clients[i], ACClientID);
            }
          }
          

          【讨论】:

          • 编译器仍然不允许这样做:错误 5“属性或索引器不能作为 out 或 ref 参数传递”
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-25
          • 1970-01-01
          • 2011-09-11
          • 1970-01-01
          • 1970-01-01
          • 2017-09-21
          • 2019-02-21
          相关资源
          最近更新 更多