如何生成枚举器的枚举器

时间:2018-04-24 17:15:47

标签: c# .net

我正在学习DotNet。我可以在Python上的迭代器上轻松生成迭代器,但在C#中执行它的规范方法是什么?我创建函数Slices(未测试,可能有错误)但对我来说看起来很危险的是段的创建(new):如果输入序列非常大,那么将创建许多新段。我这样做是因为: 1)段允许保持切片的大小 - 它可以在最后一个切片中切割 2)我不知道是否可以产生枚举器

替代方法可能是只创建一个段并在每次迭代时重新初始化它,但ArraySegment似乎不支持这样的事情(因此,段可能需要自定义结构)。

public static IEnumerable<ArraySegment<T>> Slices<T>(IEnumerable<T> sequence, int sliceSize) {
    T[] slice = new T[sliceSize];
    IEnumerator<T> items = sequence.GetEnumerator();
    int from = 0, to;
    while (true) {
        for (to = from; to < from + sliceSize && items.MoveNext(); to++) {
            slice[from - to] = items.Current;
        }
        from = to;
        yield return new ArraySegment<T>(slice, from, to - from);
    }
}

那么,在C#中生成迭代器迭代器的正确或/和规范方法是什么(在切片,组等中需要)

1 个答案:

答案 0 :(得分:1)

使用IEnumerator<T>

返回yield没有错
public static IEnumerable<IEnumerable<T>> 
     Slice<T>(this IEnumerable<T> sequence, int sliceSize)
{
    while(sequence.Any()) 
    {
        yield return sequence.Take(sliceSize);
        sequence = sequence.Skip(sliceSize);
    } 
}