Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取跳过的数据_C#_.net_Linq_Ienumerable - Fatal编程技术网

C# 读取跳过的数据

C# 读取跳过的数据,c#,.net,linq,ienumerable,C#,.net,Linq,Ienumerable,我有一个T的IEnumerable。我希望跳过一定数量的T,但在此过程中,我也希望读取这些T。您可以使用Take()读取T,也可以使用skip()跳过它们,但这需要多次枚举 我需要读取N个项,处理它们,然后在一个枚举中将所有未读项作为IEnumerable返回 编辑:我试图将一个IEnumerable提供给一个采用类似流的方法。也就是说,我必须只实现方法 public int Read(T[] readBuffer, int offset, int count) 问题是,我需要将可枚举数据提前

我有一个T的IEnumerable。我希望跳过一定数量的T,但在此过程中,我也希望读取这些T。您可以使用Take()读取T,也可以使用skip()跳过它们,但这需要多次枚举

我需要读取N个项,处理它们,然后在一个枚举中将所有未读项作为IEnumerable返回

编辑:我试图将一个IEnumerable提供给一个采用类似流的方法。也就是说,我必须只实现方法

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;
    }
公共静态IEnumerable SkipTake(此IEnumerable输入,int num,Action take)
{
var枚举器=input.GetEnumerator();
var chunk=新列表();
对于(int i=0;i

运气不太好。

您的实现似乎没有在正确的时间调用
MoveNext()
。您必须先调用
MoveNext()
,然后才能获取
当前的
元素:

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;
}
公共静态IEnumerable SkipTake(此IEnumerable输入,int num,Action take)
{
var枚举器=input.GetEnumerator();
var chunk=新列表();
对于(int i=0;i
编辑:为了清楚起见,这里有一个用法示例:

var list = new List<string>() {"This", "is", "an", "example", "!"};
var res = list.SkipTake(2, chunk =>
{
    Console.WriteLine(chunk.Count());
});
Console.WriteLine(res.Count());
var list=newlist(){“This”,“is”,“an”,“example”,“!”};
var res=list.SkipTake(2,chunk=>
{
Console.WriteLine(chunk.Count());
});
Console.WriteLine(res.Count());
输出是

2 3

这些藏品包括

{“这”,“是”}

{“an”,“example”,“!”}


分别,原始集合
列表
未修改。

仅迭代一次时不能跳过和执行,只需执行两部分。我认为应该从这一部分进行两次枚举:一个包含除前N个元素以外的所有元素,另一个仅包含前N个元素。然后,ofc,你必须枚举两个,如果你想跳过它们,但实际上没有跳过它们,那么就不要跳过它们。你能展示一点代码来说明你的问题吗?@CodeCaster:我有一个枚举表,需要分块阅读。我有一个分块例程,但问题是每个分块的大小只有在被请求时才知道。所以我想得到一个块,用它做点什么,然后把剩下的部分传下去。听起来你想把IEnumerable当作堆栈数据结构来对待。。。