2010-01-11 7 views
1

비슷한 개체가있는 상황이 있습니다. 기본적으로 모든 개체는 기본 형식의 컬렉션을 구현합니다. 그래서 ...재귀 비슷한 개체 선택 (LINQ)

항목 1 - 목록 Items2 - 목록 Items3

공개 목록 특가 {얻을; 세트; }

항목 2 : 항목 1 항목 3 : 항목 1

특별 { 공공 int 값 {얻을; 세트; } public string Name {get; 세트; } }

이제 나무 아래로 내려 가서 물건을 얻을 수 있습니다.하지만 기본적으로 전체 개체의 모든 "특수"클래스를 나무 아래로 가져 와서 하나의 단일 컬렉션.

LINQ로 가능합니까? 아니면 그냥 복잡한 회 돌이에 의존해야합니까?

+0

당신은 Linq-to-SQL이라는 태그를 붙 였지만 질문에는 데이터베이스에 대한 언급이없고 개체 만 언급되어 있습니다. 린크가 물건을 말하는거야? –

+0

네 말이 맞아, 나는 이것을 분명히하지 않았다. C#을 사용하는 것은 객체에 대한 Linq 일뿐입니다. – Ciel

답변

2

당신은 재귀 함수와 함께 Linq에 사용할 수 있습니다 : 내가 당신의 클래스 구조에 대한 표기법을 이해하는

static IEnumerable<Special> getSpecials(Item1 item1) 
{ 
    var item2Specials = item1.Items2.SelectMany(item2 => getSpecials(item2)); 
    var item3Specials = item1.Items3.SelectMany(item3 => getSpecials(item3)); 
    return item1.Specials.Concat(item2Specials).Concat(item3Specials); 
} 

그것은 조금 어려웠다. 난 당신이 다음 C# 클래스를 의미 있으리라 믿고있어 : 나는 또한 당신이 Linq에 - 투 - SQL의 LINQ 객체-에하지 의미하는 것으로 가정하고

class Item1 
{ 
    public List<Item2> Items2 = new List<Item2>(); 
    public List<Item3> Items3 = new List<Item3>(); 
    public List<Special> Specials = new List<Special>(); 
} 

class Item2 : Item1 { } 
class Item3 : Item1 { } 

class Special 
{ 
    public int Value { get; set; } 
    public string Name { get; set; } 
} 

. 데이터베이스에 계층 구조 데이터를 저장하려면이 작업을해서는 안되며 대신 nested set model을 살펴보십시오.

+0

@ 마크 바이어스 +1. 아주 좋은 대답. – dcp