我正在学习 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# 中生成迭代器的迭代器的正确或/和规范方法是什么(在切片、组等中需要)
返回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);
}
}
我是一名优秀的程序员,十分优秀!