我有一个IE的数量。我希望跳过一定数量的T,但在这个过程中,我也希望阅读这些T.你可以用Take()读取Ts并跳过它们跳过(),但这需要多次枚举。
我需要读取N个项目,处理它们,然后在一个枚举中将所有未读的项目作为IEnumerable返回。
编辑:我试图将IEnumerable提供给一个类似Stream的方法。也就是说,我必须实现 方法
public int Read(T[] readBuffer, int offset, int count)
问题是我需要提前读取数据的可枚举值以存储位置和还读取数据以在输入缓冲区中传回。
到目前为止,我已经尝试过这个:
public static IEnumerable<T> SkipTake<T>(this IEnumerable<T> input, int num, Action<List<T>> take)
{
var enumerator = input.GetEnumerator();
var chunk = new List<T>();
for (int i = 0; i < num; ++num)
{
chunk.Add(enumerator.Current);
if (!enumerator.MoveNext())
break;
}
take(chunk);
yield return enumerator.Current;
while (enumerator.MoveNext())
yield return enumerator.Current;
}
运气不好。
答案 0 :(得分:1)
好像您的实施不会在合适的时间调用MoveNext()
。您必须先致电MoveNext()
才能获得Current
元素:
public static IEnumerable<T> SkipTake<T>(this IEnumerable<T> input, int num, Action<List<T>> take)
{
var enumerator = input.GetEnumerator();
var chunk = new List<T>();
for (int i = 0; i < num; ++num)
{
if (!enumerator.MoveNext())
break;
chunk.Add(enumerator.Current);
}
take(chunk);
while (enumerator.MoveNext())
yield return enumerator.Current;
}
编辑:只是为了说清楚,这是一个用法示例:
var list = new List<string>() {"This", "is", "an", "example", "!"};
var res = list.SkipTake(2, chunk =>
{
Console.WriteLine(chunk.Count());
});
Console.WriteLine(res.Count());
输出
2 3
并且集合包含
{&#34;这&#34;,&#34;是&#34;}
和
{&#34;&#34;,&#34;示例&#34;,&#34;!&#34;}
分别未修改原始集合list
。