lambda表达式中的yield return?

ca9*_*3d9 0 c# linq

以下代码将列表分成以"["开头并以"]"结尾的子列表.如何将其转换为使用,yield return以便它可以懒惰地处理非常大的流输入? - 或者如何在F#中使用lazily枚举来实现它? - (没关系,我认为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?
    });
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 5

C#不支持匿名迭代器块,因此您只需要使用命名方法而不是匿名方法.

public static IEnumerable<IEnumerable<string>> Split(IEnumerable<string> tokens)
{
    using(var iterator = tokens.GetEnumerator())
        while(iterator.MoveNext())
            if(iterator.Current == "[")
                yield return SplitGroup(iterator);
}

public static IEnumerable<string> SplitGroup(
    IEnumerator<string> iterator)
{
    while(iterator.MoveNext() && iterator.Current != "]")
        yield return iterator.Current;
}
Run Code Online (Sandbox Code Playgroud)