C# で、T 型の CollectionBase があり、CollectionBase の各項目が同じ T 型の子 CollectionBase を持つことができる場合、再帰関数を使用せずにすべての T 型オブジェクトのリストを取得するにはどうすればよいでしょうか?
LINQ にはこれを行う機能がありますか?
前もって感謝します。
C# で、T 型の CollectionBase があり、CollectionBase の各項目が同じ T 型の子 CollectionBase を持つことができる場合、再帰関数を使用せずにすべての T 型オブジェクトのリストを取得するにはどうすればよいでしょうか?
LINQ にはこれを行う機能がありますか?
前もって感謝します。
Wes Dyer が実際にこれについて素晴らしいトピックを書いています。
あなたのケースに関しては、おそらく次のようなイテレータが必要になると思います:
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からの回答です。
編集:木を横断することもできることを覚えています。
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);
}
}