2013-06-08 1 views
0

'으로 변환 할 수 없습니다. TreeView에 경로 목록을 표시하려면 WPF 프로젝트에서 작업하고 있습니다. 내가 propertyPaths 있습니다. : 경로 ID를 가지고 (예 "NetworkControl.AlternateIndexText.Value를)TreeView : 'System.Collections.Generic.IEnumerable <string>'에서 'System.Collections.Generic.IEnumerable

하는 TreeModel

public class MessageElement 
{ 
    private int id; 
    public string Name { get; set; } 
    public string path { get; set; } 
    public List<MessageElement> Children { get; set; } 
    public List<MessageElement> messageElements { get; set; } 

    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; 

    } 
} 

일부 데이터

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.Add(new MessageElement(3, "VehicleSummary.VehicleIdentification.IdentificationID.Value")); 
     messageElements.Add(new MessageElement(3, "TitleSummary.JurisdictionTitlingKeyText.Value")); 
     messageElements.Add(new MessageElement(1, "VehicleSummary.VehicleIdentification.IdentificationID.Value")); 



     return messageElements; 

}을 (를) MOQ

재귀 트리를 만들 :

public List<MessageElement> BuildTree(IEnumerable<MessageElement> messageElements) 
    { 

     return (
      from element in messageElements   // Ex:(1, "NetworkControl.AlternateIndexText.Value") 
      let elementId = element.id      // get id from message element 
      let splitPath = element.path.Split('.') // get path from message element 
      group element by element.path.Split('.')[0] into pathElementGroup 

      select new MessageElement(ID, path) 
      { 
      ID = elementId, ??         // id of each path Ex: 1 => "NetworkControl.AlternateIndexText.Value" 
       Name = pathElementGroup.Key,    //name of each tree node to be displayed on tree 
       Children = BuildTree(     //create child from the propertyPath 
       (from propertyPathElement in pathElementGroup 
        where propertyPathElement.path.Length > pathElementGroup.Key.Length + 1 
        select new MessageElement()) 
       .ToList<MessageElement>()) 
      } 
     ); 

    } 


    } 

재귀 적으로 트리를 만들 수 있도록이 예외를 어떻게 제거 할 수 있습니까?

+0

예외의 전체 메시지를 나열하고 이상적으로 스택 추적을 나열 할 수 있습니까? – svick

+0

@Rob 'MessageElement.BuildTree (System.Collections.Generic.IEnumerable )에 대한 잘못된 오버로드 된 메서드가 있습니다. 잘못된 인수가 있습니다. –

+0

"pathElementGroup"의 데이터 형식은 무엇입니까? – RockWorld

답변

0

시도를 코드를 사용하려면 데이터를 투영 할 때 MessageElement를 작성해야합니다. 다음을 허용하는 Build List 함수를 사용해야합니다. List<MessageElement >

참고로, 왜 BuildList 메소드의 입력 매개 변수로 IEnumerable<MessageElement>을 수락하지 않습니까?

var result = BuildTree(0, GetRequestTreeNodes()); 

public List<MessageElement> BuildTree(int depth, List<MessageElement> messageElements) 
     { 
      if (messageElements == null) 
      { 
       return null; 
      } 
      return (
        from element in BuildGrouping(depth, messageElements)   // Ex:(1, "NetworkControl.AlternateIndexText.Value") 
        let elementId = element.Key      // get id from message element 

        select new MessageElement() 
        { 
         ID = depth,         // id of each path Ex: 1 => "NetworkControl.AlternateIndexText.Value" 
         Name = element.Key,    //name of each tree node to be displayed on tree 
         Children = BuildTree(depth +1,     //create child from the propertyPath 
         element.ToList<MessageElement>()) 
        } 
       ).ToList<MessageElement>(); 

     } 

     public IEnumerable<IGrouping<string, MessageElement>> BuildGrouping(int depth, List<MessageElement> messageElements) 
     { 
      string key = string.Empty; 
      if (messageElements != null && messageElements.Count > 0) 
      { 
       string[] splits = messageElements[0].path.Split('.'); 
       if (splits.Length > depth) 
       { 
        key = splits[depth]; 
       } 
      } 

      if (string.IsNullOrEmpty(key)) 
      { 
       return new List<IGrouping<string, MessageElement>>(); 
      } 

      return from element in messageElements group element by element.path.Split('.')[depth]; 
     } 
+0

으로 업데이트했습니다. 사용해 주셔서 감사합니다. 그 경우 IEnumerable을 사용합니다. 이 일을 시작할 때 일을 더 쉽게 만든다. 나는 생각보다 쉬운 일을 시도했다. 나에게 그 이점을 설명해 줄 수 있다면 좋을까. –

+0

LINQ는 일반 IEnumerable 인터페이스를 기반으로 한 구문 설탕이다. det를 확인한다. http://msdn.microsoft.com/en-us/library/vstudio/bb397947.aspx – RockWorld

+0

내 ViewModel에서 코드를 테스트 한 후 null 참조 예외가 발생했습니다. 원래 게시물을 업데이트했습니다. 그걸 볼 수 있니? –

0

당신이 ToList 적용해야 있도록 LINQ 쿼리는 일부 를 IEnumerable < T> 아닌 목록 < T>, 반환하기 때문에이를 사용하는

BuildTree(     //create child from the propertyPath 
    (from propertyPathElement in pathElementGroup 
    where propertyPathElement.path.Length > pathElementGroup.Key.Length + 1 
    select propertyPathElement.path.Substring(pathElementGroup.Key.Length + 1)).ToList()) 
      } 
+0

'System.Collections.Generic.List '에서 'System.Collections.Generic.List '로 변환 할 수없는 세 가지 예외가 발생했습니다. 'elementId'이름이 현재 컨텍스트에 없습니다. \t 'MessageElement.BuildTree (System.Collections.Generic.List )에 대한 최상의 오버로드 된 메서드는 잘못된 인수가 있습니다. 또한 linq에 새로운 기능이 있습니다. 설명이있는 전체 코드 –

+0

"propertyPathElement.path.Substring (pathElementGroup.Key.길이 = 1) "그래서 그것은 IEnumerable을 생성합니다 Pragmateek

+0

이것은 캐스팅 문제를 해결하는 것 같지만 어떻게 각 ID/경로를 추출 할 수 있습니까? Children = BuildTree (// pathElementGroup의 propertyPathElement에서 (자식을 BuildPath로 만듭니다. 여기서 propertyPathElement .Path.Length> pathElementGroup.Key.Length + 1 새 MessageElement() 선택) ToList () –

관련 문제