2010-05-27 2 views
0

다음 컬렉션이 포함되어 있습니다. 다음 컬렉션이 있습니다.linq를 사용하여 카테고리 목록 만들기

어떻게 중첩 된 항목을 얻을 수 있도록 linq로 변환 할 수 있습니다. 이 같은

var categories = new List<Category>(); // id, parentId, name 
     categories.Add(1, 0, "Sport"); 
     categories.Add(2, 0, "Pets"); 
     categories.Add(3, 1, "Foot ball"); 
     categories.Add(4, 2, "Cat"); 
     categories.Add(5, 3, "Pele"); 
     categories.Add(6, 4, "whiskers"); 
     // ie Pets - > Cat - > Whiskers 





    public class Category 
    { 

     public int Id { get; set; } 
     public int ParentId { get; set; } 
     public ICollection<Category> Categories { get; set; } 

    } 
+0

귀하의 질문. 그것은 말도 안돼. 또한 가상 속성이 이상합니다. – Will

+0

ParentID의 ID가 달라야하지 않습니까? 예 : 고양이와 수염은 ID 1이고 "풋볼"과 펠레는 2 가지 방법으로 그룹화 할 수 있습니까? – MrEdmundo

+0

출력으로 원하는 것은 무엇입니까? Category 생성자는 무엇입니까? (내가 본 것처럼,'Add' 메소드 호출은 실패 할 것입니다 ...) –

답변

1

뭔가 : 당신이 뭔가 더 일반적인 여러 수준 나는 당신이 그것을 할 수 있는지 확실하지 않습니다 필요하면

 var nested = categories.GroupBy(c => c.ParentId) 
           .Select(cat => new Category 
           { 
            ParentId = cat.Key, 
            Categories = cat.Select(x => new Category 
                    { 
                     Id = x.Id 
                    }).ToList() 
           }); 

나는, 유사한 작동하지만 두 가지 수준의 뭔가를했다 적어도 LINQ.

HTH

0

여기에 한 가지 방법이 있습니다. (수정, 고아에 대한 수정, 모든 뿌리 반환)

List<Category> results = new List<Category>(); 
Dictionary quickCategories = categories.ToDictionary(c => c.ID); 

foreach(var g in categories.GroupBy(c => c.ParentID)) 
{ 
    if quickCategories.ContainsKey(g.Key) 
    { 
    quickCategories[g.Key].Categories = g.ToList(); 
    } 
    else 
    { 
    results.AddRange(g); 
    } 
} 
+0

안녕하세요, 첫 번째 시도했지만, 부모님은 사전이 아닙니다. 또한 두 번째 시도했지만, 어떻게이 값을 반환합니까? – frosty

+0

고아가 있어야합니다. –

관련 문제