读取跳过的数据

Read skipped data

我有一个T的IEnumerable,我想跳过一定数量的T,但在这个过程中,我也想读这些T,你可以用Take()读T,用跳过T Skip(),但这将需要多个枚举。

我需要读取 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;
    }

运气不佳。

您的实施似乎没有在正确的时间调用 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

并且集合包含

{"This", "is"}

{"an", "example", "!"}

分别和原始集合list没有修改。