mostrar - lista de objetos c#
convertir Lista<Lista<objeto>> a IList<IList<objeto>> (6)
Debe cambiar la declaración de la variable de resultado de List<List<object>
a IList<IList<object>>
Que puede crear una instancia contra la List<IList<object>>
Y cada elemento en el resultado puede ser de tipo List<object>
static IList<IList<object>> Test()
{
IList<IList<object>> result = new List<IList<object>>();
var item = new List<object>() { "one", "two", "three" };
result.Add(item);
return result;
}
He escrito un método que es public List<List<object>> Fetch(string data)
, dentro de I create List<List<object>> p = new List<List<object>>();
mi jefe ahora quiere devolver un IList<IList<object>>
lugar de List<List<object>>
es decir
public IList<IList<object>> Fetch(string data)
,
así que cuando intento hacer return (IList<IList<object>>) p; //throws an exception
return (IList<IList<object>>) p; //throws an exception
¿Cómo convierto la List<List<object>>
a IList<IList<object>>
y de nuevo a la List<List<object>>
Gracias.
No puedes realizar esa conversión a través de un casting directo, no sería seguro. En su lugar, debe utilizar:
IList<IList<object>> ret = new List<IList<object>>();
Entonces para cada "lista secundaria" puedes usar:
// Or whatever
ret.Add(new List<object>());
Finalmente, solo regresa ret
.
Podría usar LINQ para realizar la conversión de su List<List<object>>
existente List<List<object>>
cuando la devuelva, pero sería mejor crear un tipo más apropiado para comenzar, como se muestra arriba.
Para comprender por qué algunas de las respuestas existentes son incorrectas, suponga que podría hacer esto:
IList<IList<object>> p = new List<List<object>>();
Entonces esto sería válido:
List<List<object>> listOfLists = new List<List<object>>();
IList<IList<object>> p = listOfLists;
p.Add(new object[]);
List<object> list = p[0];
Pero p[0]
es una referencia a un object[]
, no a la List<object>
... nuestro código supuestamente seguro de tipos ya no parece tan seguro ...
Afortunadamente, IList<T>
es invariante para evitar exactamente este problema.
Tendrías que declarar tu lista como
IList<IList<object>> list = new List<IList<object>>(); // Works!
Esto funciona, porque solo se crea la lista externa en primer lugar. Luego puede insertar elementos individuales que son compatibles con IList<object>
:
list.Add(new List<object>());
list.Add(new object[10]);
List<T>
e IList<T>
no admiten covarianza. Así que esto no se compila:
List<List<string>> list = new List<IList<string>>(); // DOES NOT COMPILE!!!!!
public IList<IList<object>> Fetch(string data)
{
IList<IList<object>> p = new List<IList<object>>();
// add your stuff here
return p;
}
var myOriginalList = new List<List<Object>>();
var converted = ((IList<IList<Object>>)myOriginalList.Cast<IList<Object>>().ToList()); // EDIT: Added .ToList() here
No debería necesitar volver atrás; puede hacer casi todo lo que pueda en la List
IList
.