asg*_*las 14 c# linq ienumerable
我有一系列元素.该序列只能迭代一次并且可以是"无限的".
获得这样一个序列的头部和尾部的最佳方法是什么?
Tom*_*cek 23
分解IEnumerable<T>
成头和尾是不是递归处理特别好(不像功能列表),因为当您使用尾巴操作递归,你会创建一些间接性的.但是,你可以写这样的东西:
我忽略了参数检查和异常处理之类的东西,但它显示了这个想法......
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;
}
Run Code Online (Sandbox Code Playgroud)
该HeadAndTail
方法获取第一个元素并将其作为元组的第一个元素返回.元组的第二个元素是IEnumerable<T>
从剩余元素生成的(通过迭代我们已经创建的其余枚举数).