众所周知,Enumerable.SelectMany
将一个序列序列展平为单个序列。如果我们想要一种可以递归地展平序列序列的方法怎么办?
我很快想出了一个使用 的实现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 语言的示例。