2015-11-01 108 views
0

在C#中,如果我有一個T類型的CollectionBase,並且CollectionBase中的每個項目都可以具有相同類型T的子類CollectionBase,那麼如何在不使用遞歸函數的情況下獲得所有類型T對象的列表?如何獲取CollectionBase項目的列表?

LINQ是否有這個功能?

在此先感謝。

+0

孩子的物品可以有孩子等嗎?你爲什麼不想使用遞歸? – Blorgbeard

+0

請參閱此[問題](http://stackoverflow.com/questions/4814242/linq-recursion-function)。 – Han

+0

你能告訴我們一些CollectionBase的代碼嗎?我asume SelectMany是你在找什麼。 –

回答

0

韋斯代爾實際上寫了一個很好的話題,有一個look

至於你的情況,我認爲你需要一個迭代器,大概是這樣的:

public static IEnumerable<T> Flatten<T>(this IEnumerable<T> e, Func<T,IEnumerable<T>> f) 
{ 
    return e.SelectMany(c => f(c).Flatten(f)).Concat(e); 
} 

這是回答是從here拍攝。

編輯:我只記得你也可以traverse這棵樹。

public static IEnumerable<T> Traverse<T>(T item, Func<T, IEnumerable<T>> childSelector) 
{ 
    var stack = new Stack<T>(); 
    stack.Push(item); 
    while (stack.Any()) 
    { 
     var next = stack.Pop(); 
     yield return next; 
     foreach (var child in childSelector(next)) 
     stack.Push(child); 
    } 
}