【发布时间】:2016-05-30 03:29:22
【问题描述】:
以下代码会将列表分成以“[”开头并以“]”结尾的子列表。如何将其转换为使用yield return,以便它可以懒惰地处理非常大的流输入? --或者如何在 F# 中通过惰性枚举来实现它?--(没关系,我认为 f#implementation 应该是微不足道的)
var list = new List<string> { "[", "1", "2", "3", "]", "[", "2", "2", "]", "[", "3", "]" };
IEnumerable<IEnumerable<string>> result = Split(list);
static IEnumerable<IEnumerable<string>> Split(List<string> list)
{
return list.Aggregate(new List<List<string>>(), // yield return?
(sum, current) =>
{
if (current == "[")
sum.Add(new List<string>());
else if (current == "]")
return sum; // Convert to yield return?
else
sum.Last().Add(current);
return sum; // Convert to yield return?
});
}
【问题讨论】:
-
感觉聚合在这里使用不太合适。编写你自己的版本,然后将逻辑叠加在上面。
-
@leppie
Aggregate的问题在于他实际上并没有聚合任何东西。 lambda 仅用于它的副作用,因此它注意到的不仅仅是一个更难阅读的foreach循环。