众所周知,
我快速想出了一种使用
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 语言的示例。