Enumeraciones vacías

Generalmente para saber si una enumeración está vacía lo que hacíamos era preguntar por la cantidad de elementos, si tenía 0 elementos estaba vacía, de lo contrario no :). Lo que hacíamos era más o menos lo siguiente:

List lista = new List();

if (lista.Count > 0)
{
    // Lista con elementos.
}
else
{ 
    // Lista sin elementos.
}

Uno de los primeros problemas que encontramos al realizar esta práctica es que, dependiendo el tipo de colección que usemos, disponemos distintos atributos para consultar por la cantidad de elementos, por ejemplo si usamos listas disponemos de la propiedad Count, en cambio si usamos un array tenemos que utilizar la propiedad Lenght.

List lista = new List();
int c1 = lista.Count; //Cantidad de elementos 0

string[] arreglo = new string[] { "elemento 1", "elemento 2" };
int c2 = arreglo.Length; //Cantidad de elementos 2

Otro de los problemas es que mucha de las veces nos encontramos con datos del tipo IEnumerable y que desconocemos la implementación real de los mismos, por lo tanto no tenemos acceso ninguna propiedad para obtener la cantidad de elementos.
Un error de la utilización de métodos cómo Count para determinar si un arreglo está vacío es que internamente estamos recorriendo de forma completa la colección para devolvemos la cantidad de elementos… todo este esfuerzo inútilmente, ya que con saber que tiene al menos un elemento podemos determinar si se encuentra vacía o no.

Por suerte tenemos a disposición el método Any para identificar si una lista está o no vacía, devolviéndonos un valor booleano (lo que es más coherente), también internamente es mucho más eficiente que los métodos anteriores, ya que recorrerá la colección y al encontrar el primer elemento devolverá true, sin tener que ir hasta el final de toda la colección.

bool listaConElementos = lista.Any(); // false
bool arregloConElementos = arreglo.Any(); // true

Más info en el post de Chris Eargle y en el de J. M. Aguilar.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s