2

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

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 对象设置一个属性。

[编辑] 我看过在“foreach”循环中修改列表的最佳方法是什么?但它没有为我提供我需要的答案。

4

4 回答 4

11

由于您从不分配参数,因此client您无需使用ref.

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

于 2009-09-28T12:48:11.727 回答
1
    private static bool AssignToChildren(ATBusiness.Objects.Client client, int ACClientID)
    {
        client.ACClientID = ACClientID;

        foreach (ATBusiness.Objects.Client child in client.Clients)
        {
            AssignToChildren(child, ACClientID);
        }
    }
于 2009-09-28T12:55:19.230 回答
0

我可以为此建议一个特定的属性吗?

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;
            }
        }
    }
}
于 2009-09-28T12:55:36.343 回答
-2

试试这个:

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);
  }
}
于 2009-09-28T12:46:51.820 回答