Quando viene fornito uno d
si potrebbe avere a che fare con una sequenza fissa come un elenco o array, un AST che enumera qualche origine dati esterna, o anche un AST su alcune raccolte esistenti. Esiste un modo per "materializzare" in modo sicuro l'enumerabile in modo che le operazioni di enumerazione come foreach, count, ecc non eseguano l'AST ogni volta?Esiste un modo per memorizzare o materializzare un oggetto IEnumerable?
Ho spesso utilizzato .ToArray()
per creare questa rappresentazione, ma se la memoria sottostante è già una lista o un'altra sequenza fissa, sembra una copia sprecata. Sarebbe bello se potessi fare
var enumerable = someEnumerable.Materialize();
if(enumberable.Any() {
foreach(var item in enumerable) {
...
}
} else {
...
}
senza doversi preoccupare che .Any()
e foreach
cercare di enumerare la sequenza di due volte e senza di essa unccessarily copiare il enumerabile.
Questa è una buona idea, ma vorrei sottolineare che spesso, existingCollection.ToList è fatto per proteggere contro le mutazioni alla collezione esistente. – Ani
Il problema con .ToList() è che creerà un elenco di enumerabili che non sono elenchi (array, ICollections, ecc.) E restituiscono una raccolta mutabile. –