Ordenando un StringCollection: ArrayList.Adapter

Como decía en mi articulo Colecciones y discusión sobre NameValueCollection, la clase StringCollection no contiene un método típico de ArrayList o List, como es el método Sort().

Existe otra solución: utilizar un adaptador de ArrayList que ordenará toda clase que implemente el interfaz IList como es el caso de StringCollection:

ArrayList.Adapter(coll).Sort();

Anuncios

septiembre 25, 2015 at 3:22 pm Deja un comentario

Colecciones y discusión sobre NameValueCollection

Vamos a darle un repaso a las colecciones elemento fundamental para programar, entre otras cosas, ya que los DataTable o DataSet cada día está más en desuso por su coste en recursos frente a las colecciones.
Vamos a ver los pros y los contras de las colecciones más famosas, y al final haremos una crítica al uso y abuso de NameValueCollection que he notado.

Gracias a Dino Esposito,gran divulgador de .NET, ya que me baso en material que él ha escrito.
Echemos un vistazo a la oferta de colecciones que nos proporciona .NET:

colecciones

Interfaces / clases

Antes de meternos con las clases, hay que remontarse a los interfaces que se encuentran en el namespace System.Collection.Generic y de las que heredan, cosa que resulta fundamental para después saber qué métodos podemos implementar o qué colecciones podemos pasar a un determinado DataSource.
Tenemos 3 interfaces fundamentales para las colecciones: ICollection, IList e IDictionary. Estas 3 heredan de IEnumerable. IList y IDictionary heredan a su vez de ICollection.

Lo más destacable de estos 3 interfaces:
1.-ICollection:De este interfaz, obtenemos los siguientes métodos: Count, CopyTo(), GetEnumerator() (para iterar la colección). También tenemos el método IsSynchronized() y Synchronize() para aislar el objeto en una aplicación multihilo.
Las clases que lo implementan directamente son por ejemplo: Queue, Stack . Estas 2 clases son curiosas porque sus elementos se destruyen después de acceder a sus datos, la diferencia es que Queue es un contenedor first-in first-out o sea el primero que pusimos es el primero al que accedemos y en el Stack es al contrario.
El problema con las colecciones que sólo heredan de ICollection es que no contemplan métodos para quitar o añadir elementos: IList.

2.-IList: Implementa ICollection y permite añadir y quitar elementos (Add / Insert / Remove / RemoveAt). También incluye: Clear(), Contains().
Clases que heredan de IList: Array, ArrayList,DataView y CollectionBase.

3.-IDictionary: tipo de colección (implementa ICollection) diferente a las anteriores, porque son colecciones de pares de clave y valor (inglés:”collection of key/value pairs”). Por explicarlo de un modo sencillo, no sólo tenemos un campo, tenemos 2, uno con la clave o índice y otro con su valor.
Incluye el método: ContainsKey() y TryGetValue() .
Los diccionarios almacenan los pares en KeyValuePairs , entonces para iterarlos podemos hacer lo siguiente:
Dictionary<string, string> dic = new Dictionary<string, string=””>();
dic.Add(“pruebaclave”, “prueba”);

foreach (KeyValuePair<string, string> kvp in dic)
{
Console.WriteLine(“key={0},value={1}”, kvp.Key,kvp.Value);
}

Si no funciona KeyValuePair, probad DictionaryEntry(por ejemplo:ListDictionary).

Las clases más típicas que implementan IDictionary: Hashtable, y SortedList. SortedList es una clase con más overhead, ya que cada vez que añades elemento hace una búsqueda binaria para ordenarlo. El problema con Hashtable es que no preserva el orden de añadido de ítems.

Las clases que he mencionado (y que implementan estos interfaces) pertenecen al espacio de nombre System.Collections en su mayoría.
Son clases muy generales que aceptan todo tipo de variables, o sea, reciben objetos / Objects, no están fuertemente tipados y en el caso de los diccionarios sólo manejan pares de clave y valor simétricos.
Su flexibilidad de uso contrasta con el coste / overhead que produce por el continuo boxing y unboxingEste enlace abre una nueva ventana que debemos realizar.

Clases Especializadas

Para salvarnos la vida existen 2 recursos: las clases genéricas enSystem.Collections.Generics (List<string>, Dictionary<string,string>), o las clases en otro espacio de nombres: System.Collection.Specialized.
Atentos, estas clases especializadas contienen un overhead: internamente algunas de ellas implementan un ArrayList o HashTable.

En este namespace, encontramos por ejemplo:
StringCollection: Es un ArrayList para strings, genial para colecciones de cadenas. Carencias: no tiene Sort al contrario que ArrayList o List.
StringDictionary: diccionario de cadenas, pero no guarda el orden de añadido y además hace lowercase a la clave.
ListDictionary: es un diccionario más rápido que un Hashtable para menos de 10 items
HybridDictionary: para mejorar el rendimiento, es una lista que empieza como ListDictionary hasta los 15 items y después cambia a Hashtable aunque pierde el orden de añadido.
OrderedDictionary: Mejor que Dictionary siempre que necesites acceder a los datos por índice ( lista[0] ). Imposible con Dictionary, HashTable, StringDictionary etc…
NameValueCollection: es un diccionario especial porque puede gestionar varios valores para una clave.Si yo añado 2 claves iguales, añadirá los valores separados por comas a la misma clave. Esto es un diccionario asimétrico. Además se puede acceder por índice.

Clases genéricas / Clases propias

De lo mejor: List<string>, Dictionary<string,string> y preferible a HashTable y ArrayList.
Aunque mejor utilizar las colecciones propias de objetos.
Un buen sistema para crear este tipo de colecciones es:
public class ActividadCollection : List<Actividad> { }

Nos ahorramos programar los métodos Add / Remove etc…aunque también puedes implementarlos heredando de las clases abstractas:CollectionBase, DictionaryBase, ReadonlyCollectionBase y NameObjectCollectionBase

NameValueCollection

Aquí dejamos el repaso a las colecciones, y hablemos de NameValueCollection.
El motivo es que me ha resultado curioso cómo se imponen modas por un motivo u otro, como por ejemplo el comparar cadenas con .ToLower() en vez de .ToUpper() cuando Microsoft recomienda lo último.
Rompamos este pequeño y diminuto mito.

Esta colección NameValueCollection aunque por su nombre parezca una colección muy sencilla, tiene un coste mayor que los otros diccionarios. Motivo: implementa un HashTable internamente. Aquí estudian su performance.
Por eso, es mejor un StringDictionary o un genérico Dictionary<string,string> a un NameValueCollection si no vamos a querer asociar varios valores a una clave.

ELEGIR COLECCIÓN

Está claro que debemos elegir la que menor coste produce, aunque debemos pensar en la mayor escalabilidad también.
Se recomienda que empecemos mirando las clases más simples y vayamos subiendo a las más complejas hasta hallar la colección idónea.
Si se trata de diccionarios y no sólo de listas, es importante saber qué cantidad de elementos vamos a manejar, si son pocos utilizamos un ListDictionary. ¿Y si no lo sabemos? El HybridDictionary es perfecto.

En el futuro hablaré de colecciones de autor que han ampliado la oferta del “coleccionista”!!

septiembre 25, 2015 at 3:20 pm Deja un comentario

Utilizar cmd como administrador en el Vista y algunos atajos de teclado raros

Recientemente me encontré con esta pregunta, quería hacer un “iisreset /stop” y para ello se me advertía que necesitaba permisos de administrador.

Está claro que si vamos a Inicio > Programas > Accesorios > Símbolo del Sistema, presionamos botón derecho y cliqueamos en “Ejecutar como administrador”, tendremos la respuesta…

Continue Reading enero 12, 2009 at 10:15 am Deja un comentario

Instalar DLL en el GAC programáticamente

Tarde o temprano tendremos que desplegar una aplicación que necesitará una DLL instalada programáticamente en el GAC…
“Para instalar una DLL en el GAC (Global Assembly Cache), tenemos la utilidad gacutil, sólo tenemos que navegar a inicio > programas > Microsoft visual studio 200x>Visual Studio tools>Visual studio command prompt…”

Continue Reading octubre 20, 2008 at 10:08 am Deja un comentario

Entradas recientes


Categorías

octubre 2019
L M X J V S D
« Sep    
 123456
78910111213
14151617181920
21222324252627
28293031  

Entradas recientes

Mis links en del.icio.us

Feeds