2009-09-28 15 views
2

J'ai un objet avec la structure suivante: (pseudocode)liste d'édition à l'intérieur de la boucle foreach

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

Je veux faire une boucle à travers toute la structure imbriquée à l'aide d'un foreach récursive, pour définir la ACClientID de tous à une valeur .

Je sais que le recenseur dans un foreach est immuable les indications suivantes ne fonctionne pas:

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); 
      } 
     } 

Quelle serait la façon la plus efficace d'atteindre mon objectif? PS: Je ne vais pas ajouter ou retirer de la structure, en définissant simplement un attribut pour chaque objet client imbriqué.

[edit] J'ai regardé What is the best way to modify a list in a 'foreach' loop? mais cela ne me donne pas la réponse dont j'ai besoin.

Répondre

11

Puisque vous n'attribuez au paramètre client vous avez besoin passent pas à l'aide ref.

Comme vous ne modifiez pas l'objet List<T>, il n'y a aucune raison de ne pas pouvoir modifier la propriété ACCClientID même lors d'une énumération. Ce n'est que lorsque vous essayez de modifier l'appartenance de la liste derrière l'énumération que vous obtiendrez une exception.

+0

avec un essai Va BRB de test unitaire. – callisto

+0

Testé, fonctionne comme prévu. Je vous remercie! – callisto

-2

Essayez ceci:

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); 
    } 
} 
+0

Le compilateur ne permet toujours pas: Erreur 5 « Une propriété ou indexeur ne peuvent pas être passés comme une sortie ou d'un paramètre ref » – callisto

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); 
     } 
    } 
0

Puis-je suggérer une propriété spécifique pour cela?

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; 
      } 
     } 
    } 
}