2012-01-25 13 views
8

En un método, obtengo un object.¿Cómo obtener la cuenta de artículos de un IList <> obtenido como objeto?

En alguna situación, este object puede ser un IList de "algo" (no tengo control sobre este "algo").

Estoy tratando de:

  1. Identificar que este objeto es un IList (de algo)
  2. emitir el object en un "IList<something>" para poder obtener la Count de ella.

Por ahora, estoy atascado y en busca de ideas.

+0

¿El 'Count' * all * que desea? Si es así, no necesita que sea un 'IList ', un simple 'IEnumerable' hará. – AakashM

+0

Sí, 'Count' es todo lo que quiero. Sin embargo, no puedo ver ningún 'Count' en' IEnumerable'? – remio

Respuesta

17

Puede verificar si su object implementa IList usando is.

Luego puede convertir su object en para obtener el conteo.

object myObject = new List<string>(); 

// check if myObject implements IList 
if (myObject is IList) 
{ 
    int listCount = ((IList)myObject).Count; 
} 
+0

Ah, genial, esto es lo que extrañé. Estaba buscando 'IList ' siendo un 'IList'. Pero como 'List ' y 'Collection ' son 'IList's, esto es suficiente para mí. Gracias. – remio

4
if (obj is ICollection) 
{ 
    var count = ((ICollection)obj).Count; 
} 
+0

Gracias por su respuesta. ¿Hay algún beneficio de lanzar en 'ICollection' sobre el casting en' IList'? – remio

+1

Funcionará con más tipos de colecciones, convertir a IEnumerable y leer .Count() en lugar de .Count funcionará con aún más. –

+1

@DannyVarod pero 'IEnumerable.Count()' corre el riesgo de enumerar la colección para contar sus elementos. – phoog

1
 object o = new int[] { 1, 2, 3 }; 

     //... 

     if (o is IList) 
     { 
      IList l = o as IList; 
      Console.WriteLine(l.Count); 
     } 

Esto imprime 3, porque int [] es un IList.

0

Como todo lo que quiere es el conteo, puede usar el hecho de que cualquier cosa que implemente IList<T> también implementa IEnumerable; y, además, existe un método de extensión en System.Linq.Enumerable que devuelve el recuento de cualquier secuencia (genérico):

var ienumerable = inputObject as IEnumerable; 
if (ienumerable != null) 
{ 
    var count = ienumerable.Cast<object>().Count(); 
} 

La llamada a Cast es porque fuera de la caja there isn't a Count on non-generic IEnumerable.

+0

¡Ah, sí, lo entiendo! Pero, ¿tendría que esperar un impacto en el rendimiento con esta implementación? – remio

+0

@remio sí, lo harías. Debido a que está llamando 'Cast ', no podrá beneficiarse de la propiedad 'Count' de la lista subyacente, por lo que repetirá toda la lista para contar los elementos. Además, si los elementos de la lista son de un tipo de valor, tendrá que encasillar cada uno de ellos debido a la conversión a 'objeto'. – phoog

Cuestiones relacionadas