gpt4 book ai didi

c# - 从只能迭代一次的 IEnumerable 获取头部和尾部

转载 作者:可可西里 更新时间:2023-11-01 07:53:53 24 4
gpt4 key购买 nike

我有一个元素序列。序列只能迭代一次,可以“无限”。

获取这样一个序列的头部和尾部的最佳方法是什么?

更新:如果我在原始问题中包含一些说明,那就更好了:)

  • 头是序列的第一个元素,尾是“其余”。这意味着尾部也是“无限”的。

  • 当我说无限时,我的意思是“非常大”和“我不想一次将它全部存储在内存中”。它也可能实际上是无限的,例如传感器数据(但它不是我的情况)。

  • 当我说它只能迭代一次时,我的意思是生成序列会占用大量资源,所以我不想再重复一次。它也可能是 volatile 数据,再次像传感器数据,在下次读取时不会相同(但在我的情况下不是)。

最佳答案

分解IEnumerable<T> into head & tail 对于递归处理(与函数列表不同)不是特别好,因为当您递归地使用 tail 操作时,您将创建许多间接。但是,您可以这样写:

我忽略了参数检查和异常处理之类的东西,但它显示了这个想法......

Tuple<T, IEnumerable<T>> HeadAndTail<T>(IEnumerable<T> source) {
// Get first element of the 'source' (assuming it is there)
var en = source.GetEnumerator();
en.MoveNext();
// Return first element and Enumerable that iterates over the rest
return Tuple.Create(en.Current, EnumerateTail(en));
}

// Turn remaining (unconsumed) elements of enumerator into enumerable
IEnumerable<T> EnumerateTail<T>(IEnumerator en) {
while(en.MoveNext()) yield return en.Current;
}

HeadAndTail方法获取第一个元素并将其作为元组的第一个元素返回。元组的第二个元素是 IEnumerable<T>这是从剩余元素生成的(通过迭代我们已经创建的枚举器的其余部分)。

关于c# - 从只能迭代一次的 IEnumerable 获取头部和尾部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5245703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com