假設我有一個IEnumerable<T>
,我想取第一個元素並將其餘元素傳遞給其他代碼。我可以使用Take(n)
獲得第一個n元素,但是如何在不導致枚舉重新啓動的情況下訪問其餘元素?我可以從枚舉中獲取前n個元素,然後仍然使用枚舉的其餘部分?
例如,假設我有一個方法ReadRecords
,它接受CSV文件中的記錄爲IEnumerable<string>
。現在假設在該方法中,我想讀取第一條記錄(標題),然後將其餘記錄傳遞給ReadDataRecords
方法,該方法也需要IEnumerable<string>
。就像這樣:
void ReadCsv(IEnumerable<string> records)
{
var headerRecord = records.Take(1);
var dataRecords = ???
ReadDataRecords(dataRecords);
}
void ReadDataRecords(IEnumerable<string> records)
{
// ...
}
如果我準備重新開始計數,然後我可以使用dataRecords = records.Skip(1)
。但是,我不想重新啓動它 - 事實上,它可能不可重新啓動。
那麼,有沒有什麼辦法來取第一個記錄,然後剩餘的記錄(除了通過讀取所有的值到一個新的集合,並重新枚舉它們)?
如果你只需要跳過一個,那麼有什麼大不了的?只需再次枚舉並跳過一個? – Paparazzi
如果您需要[批處理支持],MoreLinq中有很好的解決方案(http://stackoverflow.com/questions/13731796/create-batches-in-linq)。還有一些關於特殊套管第一/最後一個元素的問題。 –
@Blam:如果枚舉是通過枚舉內存中的某些東西來創建的,例如枚舉列表中的項目,那麼是的。但是如果枚舉不能重新開始,或者執行起來非常昂貴呢?我不明白爲什麼應該有兩次枚舉,因爲我只想要一次獲取每個項目。 –