2010-02-05 10 views
42

Estoy tratando de convertir IList tipo a List tipo pero me sale un error cada vez.Emitir IList a la lista

List<SubProduct> subProducts= Model.subproduct; 

Model.subproduct vuelve IList<SubProduct>.

+9

es mejor programar contra la interfaz (IList) en lugar de la implimentation (Lista). Es un molde innecesario para ir a la lista. Ahora tiene que agregar el manejo de errores si, por casualidad, una implementación de IList, que no es una lista, entra en la ruta del código. –

+3

Sí, pero 'IList' no tiene cosas que' List' tenga, por ejemplo 'AddRange' –

Respuesta

87

Trate

List<SubProduct> subProducts = new List<SubProduct>(Model.subproduct); 

o

List<SubProduct> subProducts = Model.subproducts as List<SubProduct>; 
+5

Esta es la respuesta correcta, pero ¿hay algún motivo por el que desee tratar una Lista en lugar de IList? La mayoría de las veces, usar IList es una mejor opción. –

+3

IList subProducts = Model.subproduct; –

+3

@KeithRousseau Me encontré con el problema cuando necesité utilizar el método AddRange(). – ScubaSteve

3
List<SubProduct> subProducts= (List<SubProduct>)Model.subproduct; 

Los failes de conversión implícitas PORQUE List<> implementos IList, no viceversa. Por lo tanto, puede decir IList<T> foo = new List<T>(), pero no List<T> foo = (some IList-returning method or property).

+7

Solo una pequeña puntilla: List no se deriva de IList, It * implementa * IList. La palabra deriva implica que hay una relación de herencia entre los dos. –

+0

Vaya, eso es correcto. – Webleeuw

27

¿Qué tal esto:

List<SubProduct> subProducts = Model.subproduct.ToList(); 
+4

Está disponible solo si tiene acceso a las extensiones definidas en el ensamblado 'System.Linq'. – Suncat2000

+1

Esta debería ser la respuesta aceptada. –

7

En mi caso he tenido que hacer esto, porque ninguna de las soluciones sugeridas estaban disponibles:

List<SubProduct> subProducts = Model.subproduct.Cast<SubProduct>().ToList(); 
0
List<ProjectResources> list = new List<ProjectResources>();   
IList<ProjectResources> obj = `Your Data Will Be Here`; 
list = obj.ToList<ProjectResources>(); 

Esto convertiría el objeto IList en objeto de lista.

-1

Esta es la mejor opción para convertir/convertir la lista de objetos genéricos en listas de cadenas.

object valueList; 
List<string> list = ((IList)valueList).Cast<object>().Select(o => o.ToString()).ToList(); 
+0

valueList debe ser una lista de objetos –

Cuestiones relacionadas