2017-12-05 2 views
0

단일 목록을 기반으로 새로운 목록 목록을 만들고 싶습니다. 나는 내가 지리와 국가에 의해 일부 그룹을 사용하여 시도 트리 구조의 목록컬렉션을 여러 컬렉션으로 분할

GeographyName="Asia", 
{ 
    Country = "China", 
    { 
     State = "Hunan", 
     { 
      { 
       OfficeId = "1", 
       OfficeName = "Office 1" 
      }, 
      { 
       OfficeId = "2", 
       OfficeName = "Office 2" 
      } 
     }, 
     State = "Hubei" 
     { 
      { 
       OfficeId = "3", 
       OfficeName = "Office 3" 
      } 
     } 
    }, 
    Country = "India", 
    { 
     State = "Maharashtra", 
     { 
      { 
       OfficeId = "4", 
       OfficeName = "Office 4" 
      }, 
      { 
       OfficeId = "5", 
       OfficeName = "Office 5" 
      } 
     }, 
     State = "Punjab" 
     { 
      { 
       OfficeId = "6", 
       OfficeName = "Office 6" 
      } 
     } 
    }, 
}, 
GeographyName="Europe", 
{ 
    Country = "UK", 
    { 
     State = "York", 
     { 
      { 
       OfficeId = "7", 
       OfficeName = "Office 7" 
      }, 
      { 
       OfficeId = "8", 
       OfficeName = "Office 8" 
      } 
     }  
    } 
} 

을 준비하기 위해 노력하고

public class OfficeLocator 
{ 
    public String id{ get; set; } 
    public string Geography{ get; set; } 
    public string Country{ get; set; } 
    public string State{ get; set; } 
    public string OfficeName{ get; set; } 
} 

같은 목록을 가지고있다. 그러나 필요한 출력을 얻지 못하고 있습니다.
결과를 얻기 위해 루핑 논리를 사용할 수는 있지만 피하 고 linq을 사용하여 시도해보고 싶습니다.

+0

"list"라고하면 C#의'List' 유형 컬렉션 또는 JSON으로 플랫 텍스트 목록을 의미합니까? – Ferus7

+0

접근 방식을 표시 –

+0

나는 C# –

답변

3

이와 비슷한? 당신은 익명 형식의 모든 속성에 액세스 할 수있는 방법을

var allRegionGroups = allOfficeLocators 
    .GroupBy(ol => ol.Geography) 
    .Select(gGroup => new 
    { 
     GeographyName = gGroup.Key, 
     Countries = gGroup 
      .GroupBy(ol => ol.Country) 
      .Select(cGroup => new 
      { 
       Country = cGroup.Key, 
       States = cGroup 
        .GroupBy(ol => ol.State) 
        .Select(sGroup => new 
        { 
         State = sGroup.Key, 
         OfficeList = sGroup 
         .Select(ol => new { OfficeId = ol.id, ol.OfficeName }) 
         .ToList() 
        }) 
       .ToList() 
      }) 
      .ToList() 
    }) 
    .ToList(); 

:

var query = locations.GroupBy(
      x => x.Geography, 
      (a, aGroup) => new 
      { 
       A = a, 
       Items = aGroup.GroupBy(
        x => x.Country, 
        (b, bGroup) => new 
        { 
         B = b, 
         Items = bGroup.GroupBy(
          x => x.State, 
          (c, cGroup) => new 
          { 
           B = c, 
           Items = cGroup.Select(i => new {i.Id, i.OfficeName}) 
          }) 
        }) 
      }); 

그것은에 조금 더 명확한입니다 :

foreach (var region in allRegionGroups) 
{ 
    string geographyName = region.GeographyName; 
    var allCountries = region.Countries; 
    foreach (var c in allCountries) 
    { 
     string country = c.Country; 
     var allStates = c.States; 
     // and so on... 
    } 
} 
+0

솔루션 주셔서 고마워요,하지만 거기에 내가 직접 foreach 루프에가는 대신 데이터를 필터링 할 수 있도록 목록으로 어떤 방법이 있나요 –

+0

그것은 목록이며 직접 쿼리 할 수 ​​있습니다 –

+0

변환하려고 할 때 그것은 모든 유형에 나는 List에 Anonymys type을위한 타입 캐스트 에러를 얻고있다. 예 : 과 같은 되풀이 논리를 사용하여 트리 구조를 만들려고 시도하는 경우 클래스 노드 { 문자열 ID; 문자열 이름; 리스트 노드} –

0

GroupBy는, 그 경우에 편리하게되어 약간의 과부하를 가지고 읽고 쓰기.
필요에 따라 Anonimised 개체를 자신의 클래스로 바꿀 수 있습니다. 팀이 대신 메서드 구문을 사용하는 언급 한 바와 같이

0

같은 결과를 얻을 수 는 논쟁의 여지가 가독성

var projection = from location in locations 
       group location by location.Geography into geographies 
       select new 
       { 
        Geography = geographies.Key, 
        Countries = from geography in geographies 
           group geography by geography.Country into countries 
           select new 
           { 
            Country = countries.Key, 
            States = from country in countries 
              group country by country.State into states 
              select new 
              { 
               State = states.Key, 
               Offices = from state in states 
                 select new 
                 { 
                  Id = state.Id, 
                  Office = state.Office, 
                 } 
              } 
           } 
       }; 

에 대한 쿼리 구문에 의존하고, 최종 결과는이

과 같을 것이다

enter image description here

+0

안녕하세요, 나는 [질문] (https://stackoverflow.com/questions/47676098/group-by-inner-list-parameter-to) 중 하나에 비슷한 접근법을 따라 가려고했습니다. -filter-outer-list-data). 그러나 어떤 성공도 얻지 못한다. 당신이 저를 도울 수 있습니까? –

관련 문제