2

次の構造のオブジェクトがあります:(擬似コード)

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

ALLのACClientIDを値に設定するために、再帰的なforeachを使用してネストされた構造全体をループしたいと思います。

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オブジェクトごとに1つの属性を設定するだけです。

[編集] 「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 に答える