2009-09-28 1 views
2

나는 다음과 같은 구조의 객체가 (의사)편집 목록

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

내가 값으로 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); 
      } 
     } 

은 무엇 내 목표를 달성하는 가장 효율적인 방법이 될 것입니다 :

나는 다음이 작동하지 않도록 foreach 문에서 열거는 불변임을 알아?

PS : 난 첨가되지 않거나 단지 매 중첩 클라이언트 객체에 대한 하나 개의 속성을 설정하는 구조로부터 제거하는 단계를 포함한다.

[편집] 내가 What is the best way to modify a list in a 'foreach' loop? 검토 한하지만 내가 필요로하는 답을 나에게 제공하지 않습니다.

답변

11

당신이 ref를 사용하여 전달할 필요가 없습니다.

List<T> 개체를 수정하지 않으므로 열거 중에도 ACCClientID 속성을 수정할 수 없습니다. 열거 뒤에있는 목록 멤버십을 변경하려고 할 때만 예외가 발생합니다.

+0

곧 테스트 "A 속성 또는 인덱서 아웃 또는 심판 매개 변수로 전달되지 않을 수 있습니다." – callisto

+0

테스트 됨, 예상대로 작동합니다. 고맙습니다! – callisto

-2

이 시도 : 당신은 결코 매개 변수 client에 할당하지 않기 때문에

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

컴파일러는 여전히 허용하지 않습니다 오류 5 단위 테스트 BRB와 – 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

이 특정 속성을 제안 할 수 있습니까?

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