从IEnumerable获取头部和尾部,只能迭代一次

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>从剩余元素生成的(通过迭代我们已经创建的其余枚举数).

  • 我会把元组变成一个`Tuple <T,IEnumerator <T >>` - 否则它*看起来像你可以在尾部迭代几次,但你真的不能. (3认同)
  • @asgerhallas:是的,对于第100,000个项目,你会要求第99,999个迭代器移动到下一个项目,这将询问99,998th迭代器等.讨厌的堆栈:) (3认同)