【问题标题】:Read skipped data读取跳过的数据
【发布时间】:2015-01-16 11:35:03
【问题描述】:

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

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

编辑:我正在尝试将 IEnumerable 提供给采用 Stream-alike 的方法。即,我必须只实现方法

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;
    }

运气不好。

【问题讨论】:

  • 只迭代一次时不能跳过并取,两部分都取即可
  • 我认为您应该对此进行 2 个枚举:一个包含除第一个 N 之外的所有元素,另一个仅包含前 N 个元素。然后,ofc,你将不得不枚举两者
  • 如果您想跳过它们但实际上不跳过它们,那么就不要跳过它们。你能展示一些代码来说明你的问题吗?
  • @CodeCaster:我有一个可枚举的,我需要分块读取。我有一个分块例程,但问题是每个块的大小只有在请求时才知道。所以我想得到一个块,用它做点什么,然后让剩下的传递下去。
  • 听起来您想将 IEnumerable 视为堆栈数据结构...

标签: c# .net linq ienumerable


【解决方案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

并且集合包含

{“这个”、“是”}

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

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

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2017-10-16
    • 2023-04-01
    • 1970-01-01
    • 2018-11-25
    • 2014-08-03
    • 2013-11-30
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多