Załóżmy, że mam IEnumerable<T>
i chcę wziąć pierwszy element i przekazać pozostałe elementy do innego kodu. Mogę uzyskać pierwsze elementy z wykorzystaniem , używając Take(n)
, ale jak mogę uzyskać dostęp do pozostałych elementów bez powodowania ponownego uruchomienia wyliczenia?Czy mogę wziąć pierwsze n elementów z wyliczenia, a następnie użyć reszty wyliczenia?
Załóżmy na przykład, że mam metodę ReadRecords
, która akceptuje rekordy w pliku CSV jako IEnumerable<string>
. Załóżmy teraz, że w tej metodzie chcę odczytać pierwszy rekord (nagłówki), a następnie przekazać pozostałe rekordy do metody ReadDataRecords
, która również zajmuje IEnumerable<string>
. Tak:
void ReadCsv(IEnumerable<string> records)
{
var headerRecord = records.Take(1);
var dataRecords = ???
ReadDataRecords(dataRecords);
}
void ReadDataRecords(IEnumerable<string> records)
{
// ...
}
Gdybym był gotów ponownie rozpocząć wyliczanie, wtedy będę mógł używać dataRecords = records.Skip(1)
. Nie chcę jednak ponownie go uruchamiać - w rzeczywistości może on nie zostać ponownie uruchomiony.
Czy istnieje sposób na pobranie pierwszych rekordów, a następnie pozostałych rekordów (innych niż poprzez odczyt wszystkich wartości do nowej kolekcji i ponowne ich wyliczenie)?
Jeśli chcesz tylko pominąć jedną, to jaka jest wielka sprawa? Po prostu wyliczając ponownie i pomijając jeden? – Paparazzi
Jest fajne rozwiązanie w MoreLinq, jeśli potrzebujesz [wsparcia batching] (http://stackoverflow.com/questions/13731796/create-batches-in-linq). Pojawiło się również kilka pytań dotyczących specjalnego pierwszego/ostatniego elementu obudowy. –
@Blam: Jeśli wyliczenie zostało utworzone przez wyliczenie czegoś w pamięci, takiego jak wyliczenie pozycji na liście, to tak. Ale co, jeśli wyliczenia nie można ponownie uruchomić lub jest bardzo kosztowne w wykonaniu? Nie rozumiem, dlaczego konieczne jest posiadanie dwóch wyliczeń, gdy chcę pobrać tylko jeden przedmiot dokładnie jeden raz. –