以下代码将列表分成以“ [”开头和“]”结尾的子列表。如何将其转换为使用
yield return
,以便可以懒惰地处理非常大的流输入?--或者如何在F#中实现它并进行懒惰枚举?--(不要紧,我认为F#实现应该很简单)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?
});
}
Aggregate
的问题在于它实际上并没有聚合任何东西。Lambda 表达式仅用于其副作用,因此它只不过是一个更难读的foreach
循环。 - Servy