Cuando se le presente un d
, podría tratarse de una secuencia fija como una lista o matriz, una AST que enumerará alguna fuente de datos externa, o incluso una AST en alguna colección existente. ¿Hay alguna forma de "materializar" con seguridad el enumerable para que las operaciones de enumeración como foreach, count, etc. no ejecuten el AST cada vez?¿Hay alguna manera de memorizar o materializar un IEnumerable?
A menudo he usado .ToArray()
para crear esta representación, pero si el almacenamiento subyacente ya es una lista u otra secuencia fija, eso parece una copia desperdiciada. Sería bueno si pudiera hacerlo
var enumerable = someEnumerable.Materialize();
if(enumberable.Any() {
foreach(var item in enumerable) {
...
}
} else {
...
}
Sin tener que preocuparse de que .Any()
y foreach
intentar enumerar la secuencia dos veces y sin ella unccessarily copiar el enumerable.
Esta es una buena idea, pero me gustaría señalar que a menudo, existingCollection.ToList se realiza para proteger contra las mutaciones de la colección existente. – Ani
El problema con .ToList() es que creará una lista de enumerables que no son listas (arrays, ICollections, etc.) y devolverá una colección mutable. –