¿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.Linqdirectiva 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>.Sortnormalmente 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