¿Cómo puedo convertir un List<MyObject>
en un IEnumerable<MyObject>
y luego volver de nuevo?
Quiero hacer esto para ejecutar una serie de declaraciones LINQ en la Lista, por ejemplo Sort()
c#
linq
list
ienumerable
TK.
fuente
fuente
Respuestas:
fuente
using System.Linq;
o no podrá ToList ()A
List<T>
es unIEnumerable<T>
, por lo que en realidad no es necesario 'convertir'List<T>
a en unIEnumerable<T>
. Como aList<T>
es anIEnumerable<T>
, simplemente puede asignarList<T>
a una variable de tipoIEnumerable<T>
.Al revés, no todos
IEnumerable<T>
son fuera deList<T>
curso, por lo que tendrás que llamar alToList()
método de miembro deIEnumerable<T>
.fuente
A
List<T>
ya es anIEnumerable<T>
, por lo que puede ejecutar declaraciones LINQ directamente en suList<T>
variable.Si no ve los métodos de extensión LINQ como
OrderBy()
supongo, es porque no tiene unausing System.Linq
directiva en su archivo fuente.Sin
List<T>
embargo, debe convertir el resultado de la expresión LINQ a explícitamente:fuente
Aparte: tenga en cuenta que los operadores LINQ estándar (como en el ejemplo anterior) no cambian la lista existente ;
list.OrderBy(...).ToList()
crearán una nueva lista basada en la secuencia reordenada. Sin embargo, es bastante fácil crear un método de extensión que le permita usar lambdas conList<T>.Sort
:Entonces puedes usar:
Esto actualiza la lista existente de la misma forma que
List<T>.Sort
normalmente lo hace.fuente
ToList
- Sin embargo, lo aclararé.Convirtiendo
List<T>
aIEnumerable<T>
List<T>
implementaIEnumerable<T>
(y muchos otros comoIList<T>, ICollection<T>
), por lo tanto, no es necesario convertir una Lista de nuevo a IEnumerable ya que ya es unIEnumerable<T>
.Ejemplo:
También puedes usar el
Enumerable.AsEnumerable()
métodoConvirtiendo
IEnumerable<T>
aList<T>
Esto es útil en Entity Framework .
fuente
Para evitar la duplicación en la memoria, resharper sugiere esto:
.ToList () devuelve una nueva lista inmutable. Por lo tanto, los cambios en listAgain no afectan a myList en la respuesta de @Tamas Czinege. Esto es correcto en la mayoría de los casos por al menos dos razones: Esto ayuda a prevenir cambios en un área que afectan a la otra área (acoplamiento flojo), y es muy legible, ya que no deberíamos diseñar código con preocupaciones del compilador.
Pero hay ciertos casos, como estar en un bucle cerrado o trabajar en un sistema integrado o con poca memoria, donde se deben tener en cuenta las consideraciones del compilador.
fuente