2012-02-13 3 views
0

일반 공개 T을 사용하여 객체 계층 구조를 병합하고 싶습니다.재귀 및 제네릭으로 계층 구조에서 선택된 노드 제거

이 링크 Recursive List Flattening

는이 IEnumerable을 통과 복용하는 것을 수행하는 방법을 보여줍니다. 하지만 전달 된 객체 T를 평평하게하고 싶습니다.

일반적이고 반복적 인 방식으로 Children을 속성 화합니다.

U1.Children(U2,U3,U4) 
U2.Children(U9,U10) 
U3.Children(U11,U12) 
U4.Children(U20,U30) 

나는 방법 U1 (선택된 노드)를 통과하고 나는이 단순 목록 싶어 :

U1,U2,U3,U4,U9,U10,U11,U12,U20,U30 

는 일반적인 방법으로 어떻게 든 할 수 있습니까? 당신의 계층은 아닌 단 하나 수준의 깊이가있는 경우

답변

2

이 있는지 알고 있어야합니다 : 다음

public static IEnumerable<T> Flatten<T>(this T root, Func<T, IEnumerable<T>> getChildren) 
{ 
    IEnumerable<T> rootSingleton = new T[] { root }; 
    IEnumerable<T> children = getChildren(root); 
    IEnumerable<T> descendants = children.SelectMany(child => Flatten(child, getChildren)); 
    return rootSingleton.Concat(descendants); 
} 

을 그렇게처럼 소비 수 :

var flat = u1.Flatten(u => u.Children); 
0

당신은 당신이 Children 속성이 몇 가지 기본 클래스 또는 인터페이스를 제약 조건거야 그럼이 코드는 uness를 컴파일되지 않습니다

public IEnumerable<T> Flattern<T>(IEnumerable<T> input) where T : ISomeinterface { 
    return input.SelectMany(t=> t.Children).Union(input) 
} 

조합

많은을 선택 사용할 수 있습니다. 컴파일러는 객체 당신은 검색 어린이를위한 기능을 허용하는 재귀 확장 메서드를 정의 할 수있는 propertyl

+0

nah ... 입력 내용은 IEnumerable 이 아니어야하며 Children 속성이있는 T 여야합니다. 내 견본을 참조하십시오. – Pascal