我正在学习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#中生成迭代器迭代器的正确或/和规范方法是什么(在切片,组等中需要)
答案 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);
}
}