2016-06-21 4 views
0

다음 데이터 구조가 있고 RelationId를 기반으로 계층 구조에 숨김을 넣으려고합니다. 이것은 RelationId에서 정렬됩니다.숫자 시퀀스를 기준으로 개체를 계층 구조로 변환

Id = 2는 relationId = 2이고 다음 두 행에는 realtionId = 0이 있습니다. (리스트로 나타내는 간략화를 위해) 다음으로 = 2

Id Name RelationId SortOrder 
    1  A  1    1 
    2  B  2    2 
    3  C  0    3 
    4  D  0    4 
    5  E  3    5 
    6  F  0    6 
    7  G  0    7 
    8  H  4    8 

최종 결과

Id = 1 
    | 
Id = 2 
    |___ Id = 3 , Id = 4 

Id = 5 
    |___ Id= 6 , Id=7 

Id = 8 

원하는 결과를 다음과 같이 표시 될 이드 아이 즉, 식 (3) 및 식 (4)을 대표한다 있습니다 . 이것은 C#에서 List<Something>

Result = 
[ 
    { Id = 1, Name = A, Children = Null }, 
    { Id = 2, Name = B, Children = [{ Id = 3, Name = C }, {Id = 4, Name = D }] }, 
    { Id = 5, Name = E, Children = [{ Id = 6, Name = F }, {Id = 7, Name = G }] }, 
    { Id = 8, Name = H} 
] 

내 시도가 실패한 내가 이런 식으로했을

var finalResult = new List<sampleDataClass>(); 
var sampleData = GetMeSampleData(); 
var count = sampleData.Count(); 

foreach (var item in sampleData) 
{ 
    var alreadyExist = finalResult.Any(x => x.Id == item.Id); 
    var newObject = new sampleDataClass(); 

    if (!alreadyExist && item.RelationId!= 0) 
    { 
     newObject = item; 
    } 

    for (int i = item.SortOrder; i < count; i++) 
    { 
     if (sampleData[i].RelationId== 0) 
     { 
      newObject.Children.Add(sampleData[i]); 
     } 
    } 

    finalResult.Add(newObject); 
} 
+0

? 그리고 최상위 수준의 부모라는 의미로 0이나 -1 등을 사용 하시겠습니까? – juharr

+0

그것은 정렬 된 배열이고 relationId = 1은 최상위 레벨입니다 – InTheWorldOfCodingApplications

+0

sortOrder 필드도 추가했습니다 – InTheWorldOfCodingApplications

답변

1

이 루트 또는 중첩 요소입니다 여부를 결정 좀 더 우아한 해결책을있을 수 있는지 알고하지 마십시오, 당신은 이러한 관계를 기반으로 그룹을 형성하고이 작업을 수행 할 수 있습니다. 나는 Linq에을 사용하는 것이 좋습니다 것

List<SomeData> somedata = ... // your data. 

int index=0; 
var results = somedata 
    .Select(x=> new {gid = x.RelationId ==0? index: ++index, item=x}) 
    .GroupBy(x=> x.gid) 
    .Select(x=> { 
     var first = x.FirstOrDefault(); 

     return new 
     { 
      Id = first.item.Id, 
      Name = first.item.Name, 
      Children = x.Skip(1).Select(s=> new { 
       Id = s.item.Id, 
       Name = s.item.Name, 
      })      
     }; 
    }) 
    .ToList(); 

출력 :

Id=1, Name=A 
Id=2, Name=B 
    Id=3, Name=C 
    Id=4, Name=D 
Id=5, Name=E 
    Id=6, Name=F 
    Id=7, Name=G 
Id=8, Name=H 

확인 당신이 부모의`Id`에서`RelationId` 지점을하지 않을 이유는이 Working Code

+0

많은 감사합니다. 매력처럼 작동합니다. – InTheWorldOfCodingApplications

0

을 다음과 같습니다. 당신의 RelationId 이후

var data = new List<MyDataObject>(); 
      var SampleData = GetMeSampleData; 
      var count = SampleData.Count(); 
      for (int i=0;i<count;i++) 
      { 
       var rootAdded = false; 
       var relationId = SampleData[i].relationId; 
       var alreadyExist = data.Any(x => x.Id == SampleData[i].Id); 
       var mydataObject = new MyDataObject(); 
       if (!alreadyExist && SampleData[i].RelationId != 0) 
       { 
        mydataObject = SampleData[i]; 
        rootAdded = true; 
       } 


       for(int j=i+1;j<count;j++) 
       { 
        if ((SampleData[j].RelationId == 0 && rootAdded)) 
        { 
         mydataObject.Children.Add(SampleData[j]); 
        } 
        if (SampleData[j].SubjectId != 0) 
         break; 


       } 


       if (rootAdded) 
       { 
        data.Add(mydataObject); 

       } 
관련 문제