ご存知のとおりEnumerable.SelectMany
、シーケンスのシーケンスを1つのシーケンスにフラット化します。シーケンスのシーケンスなどを再帰的にフラット化できるメソッドが必要な場合はどうなりますか?
私はすぐに、つまり熱心に評価された実装を思いつきましたが、たとえばキーワードICollection<T>
を使用して遅延評価されたものを作成する方法についてはまだ頭を悩ませています。yield
static List<T> Flatten<T>(IEnumerable list) {
var rv = new List<T>();
InnerFlatten(list, rv);
return rv;
}
static void InnerFlatten<T>(IEnumerable list, ICollection<T> acc) {
foreach (var elem in list) {
var collection = elem as IEnumerable;
if (collection != null) {
InnerFlatten(collection, acc);
}
else {
acc.Add((T)elem);
}
}
}
何か案は?.NET言語の例を歓迎します。