【发布时间】:2012-11-16 01:42:43
【问题描述】:
众所周知,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 语言的示例。
【问题讨论】:
-
也许使用 Y 组合器?这将找到固定点(即完全展平的列表)
-
Recursive List Flattening 的可能重复项
-
@Scorpi0:非常相似,但不完全相同。此问题要求 C# 或 F#(根据标签)或其他 .net 语言(来自问题)的答案。另一个问题是 C# 特有的。