LINQ, tal como se aplica a través de los métodos de extensión dentro de la clase Enumerable
, se basa en ejecución diferida:
métodos que se utilizan en una consulta que devuelve una secuencia de valores no consumen los datos de destino hasta que la consulta el objeto está enumerado. Esto se conoce como ejecución diferida.
Cast<T>
no crea una nueva lista inmediatamente, sino que almacena toda la información necesaria para realizar la acción. La lista solo se enumerará cuando sea necesario (por ejemplo, a través de una declaración foreach
).
En su caso, si lo único que va a iterar sobre la secuencia, se debe considerar que se pega a la interfaz IEnumerable<T>
, que es el tipo de retorno declarado de Cast<T>
:
IEnumerable<SomethingElse> second = first.Cast<SomethingElse>();
foreach (SomethingElse se in second)
{
// ...
}
Esta es eficiente, ya que sólo realiza el reparto ya que cada elemento se itera.
Si usted está convencido de que desea una nueva lista que se crea inmediatamente, utilice ToList
:
List<SomethingElse> second = first.Cast<SomethingElse>().ToList();
Editar: Respondiendo a punto publicado en el comentario:
Depende de lo que entiendas por "una lista que se puede modificar". Hay varios operadores de consulta LINQ que le permitirán modificar aún más la definición de su consulta. Por ejemplo, si desea eliminar todos los SomethingElse
elementos cuya IsDeleted
propiedad es true
, se puede utilizar el Where
operador:
IEnumerable<SomethingElse> second = first.Cast<SomethingElse>();
second = second.Where(element => !element.IsDeleted);
Si desea agregar una secuencia de nuevos elementos, se puede utilizar el operador Concat
:
second = second.Concat(anotherCollectionOfSomethingElse);
Si desea ordenar la secuencia en orden ascendente de ID
, utilice el operador OrderBy
:
second = second.OrderBy(element => element.ID);
Cada vez, estamos aplicando un operador de consulta sobre la anterior definición de nuestra consulta, y asignando la nueva consulta (compuesta) a nuestra variable second
. LINQ almacenaría todos sus operadores en la definición de consulta. Luego, cuando la secuencia se enumera realmente (por ejemplo, a través de foreach
o ToList
), le daría el resultado compuesto de su secuencia, con todos los operadores de consulta aplicados en orden.
Como en todos los casos de ejecución diferida/evaluación diferida, tenga cuidado de no excederse con esto. Si, por ejemplo, va a aplicar un operador Where
que reducirá drásticamente el tamaño de su secuencia, podría tener sentido ejecutar la consulta con entusiasmo y almacenar la lista enumerada.
¿Te fue útil? http://stackoverflow.com/questions/1266014/c-sharp-casting-a-listobjbase-as-listobj – eldarerathis
Posible duplicado de http://stackoverflow.com/questions/7955890/how-to-cast-listclassb-to -listclassa-when-classb-inherits-from-classa – dash
¿Funcionaría? Lista second = first.Select (o => (SomethingElse) o) .ToList(); –
asmo