Compartir a través de


Definir colecciones

Una colección es un conjunto de objetos con tipos similares que se agrupan juntos.

A fin de aprovechar las construcciones intrínsecas de cada lenguaje, pueden agruparse objetos de cualquier tipo en una sola colección de tipo Object. Por ejemplo, la instrucción foreach de C# (for each en Visual Basic) espera que todos los objetos de la colección sean de un mismo tipo.

Sin embargo, en una colección de tipo Object se realiza un procesamiento adicional en cada elemento, por ejemplo, conversiones boxing o unboxing, que afectan al rendimiento de la colección. Normalmente, las conversiones boxing o unboxing se producen al almacenar o recuperar un tipo de valor en una colección de tipo Object.

Las colecciones genéricas, como List<T>, y las colecciones no genéricas con establecimiento inflexible de tipos, como StringCollection, evitan estas mermas de rendimiento si el tipo del elemento es aquél para el que fue diseñada la colección (por ejemplo, al almacenar o recuperar cadenas de StringCollection). Además, las colecciones con establecimiento inflexible de tipos realizan automáticamente la validación del tipo de cada elemento que se agrega a ellas. Por estas razones, recomendamos encarecidamente que, siempre que sea posible, utilice las clases de colección genéricas.

Todas las colecciones que implementan directa o indirectamente la interfaz ICollection o la interfaz genéricaICollection<T> comparten varias características además de los métodos que agregan, quitan o buscan elementos:

  • Un enumerador.

    Un enumerador es un objeto que recorre en iteración su colección asociada. Se puede considerar como un puntero móvil que puede señalar a cualquier elemento de la colección. Un enumerador sólo se puede asociar con una colección, pero una colección puede tener múltiples enumeradores. La instrucción foreach de C# (for each en Visual Basic) utiliza el enumerador y oculta la complejidad que supone su uso.

  • Miembros de sincronización (solo las clasesSystem.Collections).

    En los tipos de colección heredados en el espacio de nombres System.Collections, la sincronización proporciona cierto grado de seguridad para subprocesos al tener acceso a los elementos de la colección. Las colecciones no tienen seguridad para los subprocesos de forma predeterminada. Si necesita un acceso multiproceso escalable y eficaz a una colección, utilice una de las clases del espacio de nombres System.Collections.Concurrent. Para obtener más información, vea Colecciones seguras para subprocesos.

    Solamente algunas clases de los espacios de nombres System.Collections proporcionan un método Synchronize capaz de crear un contenedor de seguridad para los subprocesos de la colección. Sin embargo, todas las clases de todos los espacios de nombres System.Collections proporcionan la propiedad SyncRoot, que las clases derivadas pueden utilizar para crear su propio contenedor de seguridad para subprocesos. También se proporciona la propiedad IsSynchronized con el fin de determinar si la colección tiene seguridad para subprocesos. La sincronización no está disponible en la interfaz genérica ICollection<T>.

  • El método CopyTo**.**

    Todas las colecciones pueden copiarse en una matriz usando el método CopyTo; sin embargo, el orden de los elementos de la nueva matriz se basará en la secuencia en la que los devuelve el enumerador. La matriz resultante siempre es unidimensional y su límite inferior es cero.

Tenga en cuenta que la interfaz genérica ICollection<T> tiene miembros adicionales que no están incluidos en la interfaz no genérica.

En algunas clases de los espacios de nombres System.Collections se implementan las características siguientes:

  • Capacidad y extensión.

    La capacidad de una colección es el número de elementos que puede contener. La extensión de una colección es el número de elementos que realmente contiene. BitArray constituye un caso especial, pues su capacidad coincide con su longitud que, a su vez, coincide con su extensión. Algunas colecciones ocultan su capacidad, su extensión o ambas.

    Todas las colecciones expanden automáticamente su capacidad cuando ésta alcanza su máximo actual. La memoria se vuelve a asignar y los elementos se copian de la antigua colección a la nueva. Así se reduce el código necesario para utilizar la colección; sin embargo, su rendimiento puede verse afectado desfavorablemente. La mejor forma de evitar la disminución de rendimiento que provoca la realización de múltiples reasignaciones consiste en establecer como capacidad inicial el tamaño previsto de la colección.

  • Límite inferior.

    El límite inferior de una colección es el índice de su primer elemento. Todas las colecciones indizadas de los espacios de nombres System.Collections tienen un límite inferior de cero. Aunque Array tiene un límite inferior predeterminado de cero, puede definirse otro límite inferior creando una instancia de la clase Array mediante CreateInstance.

Por norma general, las clases System.Collections pueden dividirse en tres tipos:

  • Colecciones utilizadas normalmente.

    Son las variaciones habituales de las recolecciones de datos, como tablas hash, colas, pilas, diccionarios y listas. Muchas colecciones que su usan habitualmente tienen versiones genéricas, versiones no genéricas y versiones genéricas seguras para subprocesos.

  • Colecciones de bits.

    Se trata de colecciones cuyos elementos son marcadores de bits. Se comportan de forma ligeramente diferente de las demás.

  • Colecciones especializadas.

    Se trata de colecciones con fines muy específicos, normalmente para tratar un tipo concreto de elemento, como StringDictionary.

Tenga cuidado al elegir la clase de una colección. Puesto que cada una tiene su propia funcionalidad, también presenta sus propias limitaciones. Cuanto más especializada es una colección, más limitada está. Para obtener sugerencias sobre cómo elegir una colección, vea Seleccionar una clase de colección.

Vea también

Referencia

System.Collections

System.Collections.Specialized

System.Collections.Generic

System.Collections.Concurrent

Conceptos

Seleccionar una clase de colección

Otros recursos

Colecciones y estructuras de datos