2012-02-13 52 views
0

我想用打開的Generic T將對象的層次結構展平。使用遞歸和泛型刪除層次結構中的選定節點

此鏈接Recursive List Flattening

展示瞭如何做到這一點隔空傳遞的IEnumerable。但我想扁平化一個傳遞對象T和

其屬性子類以通用和遞歸方式。

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

如果您hierarcy只有一個級別深度您可以使用許多選擇與工會

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

嗯,這代碼不能編譯UNESS你會用一些基類或接口具有Children屬性約束它。編譯器必須知道對象具有propertyl

+0

nah ...輸入不能是一個IEnumerable 但T與兒童財產。看我的樣品。 – Pascal 2012-02-13 20:14:08