Suppose I have an IEnumerable<T>
, and I want to take the first element and pass the remaining elements to some other code. I can get the first n elements using Take(n)
, but how can I then access the remaining elements without causing the enumeration to re-start?
For example, suppose I have a method ReadRecords
that accepts the records in a CSV file as IEnumerable<string>
. Now suppose that within that method, I want to read the first record (the headers), and then pass the remaining records to a ReadDataRecords
method that also takes IEnumerable<string>
. Like this:
void ReadCsv(IEnumerable<string> records)
{
var headerRecord = records.Take(1);
var dataRecords = ???
ReadDataRecords(dataRecords);
}
void ReadDataRecords(IEnumerable<string> records)
{
// ...
}
If I were prepared to re-start the enumeration, then I could use dataRecords = records.Skip(1)
. However, I don't want to re-start it - indeed, it might not be re-startable.
So, is there any way to take the first records, and then the remaining records (other than by reading all the values into a new collection and re-enumerating them)?