2013-06-08 2 views
0

WPF 프로젝트에서 트리 뷰의 경로 목록을 표시하기 위해 작업 중입니다. (: NetworkControl.AlternateIndexText.Value "예) 경로 ID를 가지고트리 : 문자열 및 구문 트리를 구문 분석하십시오.

생성자를 : 나는 propertyPaths 가 있습니다..

여기
public MessageElement() 
{ 
    Children = new List<MessageElement>(); 
    messageElements = new List<MessageElement>(); 
} 

public MessageElement(int id, string name, List<MessageElement> children) 
{ 
    this.ID = id; 
    this.Name = name; 
    this.Children = children; 
} 

public MessageElement(int id, string path) 
{ 
    this.ID = id; 
    this.path = path; 
} 

내가 구문 분석을하고있는 중이 야 방법을 보여주는하고 나는 건물입니다

IEnumerable에서 propertyPath에서 아이 나는 BuildTree 방법에 통과

public List<MessageElement> BuildTree(IEnumerable<string> propertyPath) 
{ 
    return (
      from path in propertyPath  // Ex: NetworkControl.AlternateIndexText.Value" 
      let splitPath = path.Split('.') 
      group path by path.Split('.')[0] into pathElementGroup 

      select new MessageElement(ID, path) 
      { 
       // ID = Id, 
       Name = pathElementGroup.Key,    //name of each tree node 
       Children = BuildTree(     //create child from the propertyPath 
       from propertyPathElement in pathElementGroup 
       where propertyPathElement.Length > pathElementGroup.Key.Length + 1 
       select propertyPathElement.Substring(pathElementGroup.Key.Length + 1)) 
      }).ToList(); 

    }    

채우기 데이터를 :.

public List<MessageElement> GetRequestTreeNodes() 
{ 
    messageElements.Add(new MessageElement(1, "NetworkControl.AlternateIndexText.Value")); 
    messageElements.Add(new MessageElement(2, "NetworkControl.AddressData.DestinationID")); 
    messageElements.Add(new MessageElement(2, "NetworkControl.AddressData.MessageOriginatorID.Value")); 
} 

여기에서 messageElements 목록에서 BuildTree 메서드로 전달할 목록을 준비 중입니다.

String[] propertyPath = messageElements.Select(I => Convert.ToString(I.path)).ToArray();    
// int[] idList = messageElements.Select(I => (I.id)).ToArray(); 
List<MessageElement> nodeList = BuildTree(propertyPath); 
return nodeList; 

트리 노드 및 ID를 작성하는 데 사용중인 propertyPath 목록간에 어떻게 연관을 만들 수 있습니까? 예를 들어 MessageElement (1, "NetworkControl.AlternateIndexText.Value"));

답변

0

'왜 ID가 여전히 0입니까?' 어디에도 ID를 설정하지 않는다는 것입니다. 다른 어떤 가치가 있을까요?

ID를 설정하는 가장 좋은 기회는 MessageElement 개체를 만드는 경우입니다. BuildTree 메소드의 SELECT 문에서이 작업을 수행하고 있습니다.

select new MessageElement 
        { ... } 

MessageElement를 선택하지만 ID를 전달하는 생성자를 사용하지 않으며, 초기화 블록의 ID를 설정한다. MessageElement을 생성하고 idpath을 매개 변수로 사용하는 생성자를 사용해야합니다.

select new MessageElement(theId, thePath) 
        { ... } 

어디에서 ID 값을 얻는지는 확실하지 않습니다. 당신은 나를 당신의 코드를 이해하기 어렵게 만드는 방법으로 만들고 있습니다. 의미있는 변수 이름을 사용하면 코드가 훨씬 이해하기 쉬울 것입니다. 's'와 'g'의 의미는 무엇입니까? 어떤 사람들은 그 의미가 명백하다고 주장하지만, 의미있는 이름을 사용하는 데 드는 비용은 들지 않습니다. 또한 전체 BuildTree 메서드는 return 문 하나이지만 16 줄에 걸쳐 두 개의 LINQ 이해 쿼리가 포함되어 있습니다. 좀 더 논리적 인 단계를 취하기 위해이 코드를 다시 작성하는 데 약간의 노력을 기울일 경우 문제가 더 분명해질 것이며 디버깅을 좀 더 쉽게 할 수있을 것입니다. C#은 매우 표현력이 강한 언어이지만 가능한 최소한의 문장을 얻기보다는 명확성을 높이기 위해 표현을 사용하는 것이 좋습니다.

+0

(int id, string name, List children) 생성자가 있지만 BuildTree 메서드에서 ID를 전달하는 쉬운 방법을 찾을 수 없습니다. –

+0

문제는 단순히 어디서나 ID 값을 설정하지 않는다는 것입니다. –

+0

통찰력있는 피드백에 감사드립니다. 저는 C#을 처음 접했습니다. S의 의미는 내가 통과하는 문자열 경로의 변수 이름이고 g는 위치 0의 문자열 그룹입니다. 예, 여기 내 문제는 ID를 얻는 방법입니다. –

관련 문제