2008-10-13 12 views

Respuesta

32

Estas no son todas las listas, aunque son todas colecciones. Aquí hay un resumen rápido.

colecciones

no genéricos (API es en términos de object Valores tipos están en caja

Estos son en su mayoría en el System.Collections espacio de nombres:..

  • ArrayList: Una lista de elementos, respaldados por una matriz. Rápido acceso aleatorio de lectura/escritura. Agregue rápidamente al final, si el búfer no necesita redimensionar
  • Hashtable: Mapa de la clave a valor. Las claves son únicas, los valores no tienen que serlo. Utiliza el método GetHashCode para lograr cerca de O (1) acceso de lectura/escritura (aparte de casos desagradables donde todos los artículos tienen el mismo hash, o la tienda de respaldo necesita reconstrucción). La iteración sobre los pares clave/valor da un orden impredecible. (Bueno, efectivamente impredecible.)
  • SortedList: Como una tabla Hashtable, pero las entradas siempre se devuelven ordenadas por clave. Almacenado como una lista de pares clave/valor.
  • Stack: Última-in-first-out colección
  • Queue: First-in-first-out colección
  • Array: de Tamaño fijo O (1) de acceso aleatorio; no genérico, pero también tiene formularios fuertemente tipados

Colecciones genéricas. (API inflexible de tipos, no los tipos de valor caja (suponiendo T adecuado)

Estos son en su mayoría en el System.Collections.Generic namespace:.

Posiblemente la interfaz más importante colección es IEnumerable (y IEnumerable<T>). Esto representa una secuencia de elementos muy similar a un flujo representa una secuencia de bytes. No hay acceso aleatorio, solo lectura anticipada. LINQ to Objects se basa en esto, y prácticamente todos los tipos de colección lo implementan.

+1

También hay System.Collections.Specialized con más golosinas, como StringDictionary y NameValueCollection – Hafthor

+0

@Hafthor: Sí, aunque la mayoría de ellos se han vuelto algo obsoletos con los genéricos. –

+3

Muy buena lista que ha ensamblado. Todo lo que he usado está allí. – stephenbayer

2

Si comienza en MSDN doco for System.Collections, puede profundizar en los tipos de colección individuales para obtener más detalles sobre esas "listas" y cómo usarlas. Por ejemplo, el doco para Hashtable dice: "Representa una colección de pares clave/valor que se organizan en función del código hash de la clave".

También hay una agradable discusión sobre System.Collections.Generic en Understanding Generics.

-3

Intellisense le mostrará una breve descripción de cada uno si solo escribe System.collections.Generic. en una ventana de código. No te olvides del período final. Ah, y también está System.Collections.ObjectModel.. Desde allí, podrá obtener más información sobre todo lo que prometa de MSDN.

0

Estos son ejemplos de varios tipos de general data structures. Estas estructuras de datos se utilizan en todo el lugar en la ingeniería de software.

2

La lista <T> es ordenable, pero no se recomienda su exposición pública.

Colección <T> es una colección básica, sin lujos.

Diccionario <T> es una colección de pares clave-valor (muy parecido al antiguo hashtable, pero ahora genérico).

KeyedCollection <T> es un diccionario donde la clave se puede determinar a partir del valor (esto es un resumen, por lo que debe heredar de ella y apoyar la función GetKey)

ReadOnlyCollection <T> es una colección especial donde los contenidos no pueden ser modificados

ArrayList y HashTable son básicamente obsoletos a partir de .NET 2.0.

+0

¿Tienes un enlace que sugiera la obsolescencia? – Pacerier

5

Hash mapas

  • Diccionario
  • Hashtable (no genérico)

Ésta es una estructura de datos que le permite mantener pares de valores clave. Dada una clave que tiene alguna forma de orden, puede insertar un valor. Un ejemplo simple podría ser una lista de estudiantes donde la clave es la identificación del estudiante y el valor del nombre del estudiante.

listas de acceso aleatorio

  • Lista
  • ArrayList (no genérico)

listas de acceso aleatorio se utilizan para almacenar una larga lista de objetos que van a ser visitada al azar (es decir, quiere acceder al n-ésimo elemento en O (1) vez). No es bueno si desea insertar/eliminar elementos en el medio de la lista, ya que eso requeriría que se baraje la lista completa, lo que podría llevar algún tiempo.

Las listas enlazadas y similares

  • ListaEnlazada
  • cola
  • Pila

Las listas enlazadas son grandes si usted no desea acceder a los elementos en el medio, ya que tomaría O (N) tiempo. Es genial si quieres insertar/eliminar elementos en el medio, ya que solo implica cambiar algunos punteros.

Las colas y las pilas están ligeramente especializadas, ya que están optimizadas para el comportamiento FIFO y FILO (Primero en entrar, primero en salir y Primero en entrar, primero en salir, respectivamente).

+0

¿No es un hashmap una especie de lista de acceso aleatorio también? – Pacerier

6

Debe buscar un libro sobre estructuras de datos básicas. Es la misma teoría independientemente del idioma.

Una breve explicación:

  • Array: (como en el ejemplo int[] myArray) - matriz estática que se puede utilizar cuando la colección nunca cambia (no se puede añadir o eliminar elementos en ella, pero se puede cambiar los valores de elementos individuales)
  • ArrayList: matriz/lista de propósito general que permite la enumeración relativamente rápida así como el acceso directo. Esta lista puede crecer automáticamente a medida que agrega elementos, pero como solo almacena Object, rara vez debe usarla debido a problemas de rendimiento y de seguridad de tipo.
  • List<T>: versión genérica de ArrayList anterior. Proporciona un buen equilibrio entre rendimiento y flexibilidad, y se debe usar casi siempre cuando se tiene una lista plana dinámica de elementos. (Nuevo en .NET 2.0)
  • Hashtable: Funciona como una lista plana, pero en lugar de indexarla con enteros, se puede indexar utilizando cualquier objeto. Vale la pena señalar que no hay "orden" en una tabla hash.
  • Dictionary<T>: Versión genérica de la Hashtable. Use esto en .NET 2.0 y superior en lugar de Hashtable por las mismas razones que con ArrayList vs List anterior.
  • Stack<T>: proporciona un primer tipo en el último tipo de lista. El artículo que agregó el último será el artículo que reciba primero cuando seleccione algo.
  • Queue<T>: proporciona una lista de primero en entrar primero en salir. Piense en ello como un tubo, donde inserta elementos en un extremo y los selecciona en el otro extremo. Normalmente se utiliza para pasar mensajes entre, por ejemplo, trapos.

En general, se deben utilizar las colecciones genéricas para casi todo lo que haces en .NET 2.0 y superior. Obtendrá seguridad completa de tipo (en comparación con ArrayList y HashTable) y son mucho más rápidos para tipos de valor (enteros, estructuras, flotantes, etc.) en comparación con onces no genéricos.

Si tiene una lista de elementos que nunca cambiará, o no necesita/desea la flexibilidad de List<T>, puede utilizar una matriz, ya que tiene la menor cantidad de sobrecarga de todos ellos.

Una recomendación cuando devuelve una colección de un método público o propiedad es enviarla a una interfaz menos flexible. Entonces, si tiene una Lista que devuelve, puede convertirla en IEnumerable<int>, lo que significa que su consumidor no puede agregarle elementos (a menos que, por supuesto, la devuelva, pero sigue siendo una indicación para los usuarios). Lanzarlo también le dará la flexibilidad de cambiar la estructura de datos subyacente más adelante, mientras mantiene la estabilidad API. También puede seleccionar ICollection<int> o IList<int> para exponer un poco más de funcionalidad pero manteniendo oculta la estructura de datos real.

+0

Esta es una buena lista = D Por cierto, podrías agregar en 'SortedList' y 'SortedDictionary' porque generalmente son los que son realmente confusos (incluso después de la respuesta de JonSkeet) – Pacerier

2

Además de las grandes respuestas hasta el momento, hay algunas colecciones más disponibles a través de la C5 Generic Collection Library. La documentación (también en su sitio) puede ayudar a decidir qué usar dependiendo de sus requisitos.

6

A fin de exponer sobre la respuesta anterior de Tobsen, la Biblioteca Colección C5 genérico tiene un gran número de, bueno, colecciones. Voy a describir algunos de ellos aquí:

cola/Pila

  • CircularQueue<T>: Esta clase proporciona funcionalidad estrictamente Queue y Stack. Además, eficiente O (1) el acceso a cualquier elemento de la pila/Queue está disponible mediante el indizador: cq[0] (donde 0 es el elemento más antiguo, al lado de ser quitado de la cola, último en ser metimos).

Listas

Nota: ArrayList y LinkedList también pueden funcionar como cola/Pilas

  • ArrayList<T>: Al igual que su contraparte en System.Collections.Generic (SCG), List<T>, esto está respaldado por una matriz, garantizando O (1) de indexación, pero peor caso O (n) inserción. O (n) para encontrar un artículo.
  • LinkedList<T>: Similar a su contraparte SCG.LinkedList<T>. Usando una lista doblemente enlazada, garantiza O (1) inserción, pero el peor de los casos O (n) indexación (en la práctica, es proporcional a la distancia de la cabecera o la cola de la lista). También O (n) para encontrar un artículo. La ordenación utiliza una clasificación de combinación estable.
  • HashedArrayList<T>: Similar al anterior ArrayList<T>, pero no permite duplicados. El beneficio que obtiene a cambio es que el tiempo para encontrar un artículo y su índice se reduce a O (1).
  • HashedLinkedList<T>: Similar al anterior LinkedList<T>, pero no permite duplicados.Como antes, el tiempo para encontrar un artículo se reduce a O (1), pero el tiempo para encontrar su índice sigue siendo O (n).
  • WrappedArray<T>: Bastante similar a la ArrayList<T>, esto actúa como una envoltura alrededor de una matriz que implementa C5.IList<T>, pero lanza excepciones si se hace un intento de modificar la colección (IsFixedSize es verdadera y Add, Remove, Insert no funcionan; Sort, Shuffle y Reverse lo hacen, sin embargo, ya que son operaciones in situ).

Las listas también proporcionan una funcionalidad "Ver" que representa un segmento de la lista subyacente, lo que permite realizar operaciones locales. Usando los patrones ofrecidos en el libro C5, las operaciones se pueden realizar utilizando vistas que son eficientes tanto en la matriz como en las listas vinculadas. Cualquier operación de lista también se puede realizar en una vista, restringiendo su efecto a un subconjunto de la lista subyacente.

ordenadas Colecciones

  • SortedArray<T>: Similar a un ArrayList<T> excepto que mantiene sus artículos ordenados y no permite duplicados. Tenga en cuenta que las inserciones y eliminaciones aleatorias en esta colección son lentas. Esta recopilación es mejor si el número de elementos es pequeño o rara vez se modifica, pero a menudo se accede por índice o valor del artículo.
  • TreeSet<T>: utiliza una estructura de árbol rojo-negro para mantener los elementos ordenados. Como conjunto, no permite duplicados. Acceso por el índice o elemento de valor y de inserción/deleción tomar O (log n).
  • TreeBag<T>: Utiliza un árbol rojo-negro, manteniendo los elementos ordenados. Como bolsa, permite duplicados, pero no almacena duplicados en el árbol, sino que guarda duplicados contando.

Tanto TreeSet<T> y TreeBag<T> ofrecen la posibilidad de realizar de manera eficiente "instantáneas" o copias persistentes del árbol en O (1), lo que permite iteración sobre la instantánea al modificar el árbol subyacente. Tenga en cuenta que cada instantánea en un árbol agrega una penalización de rendimiento a las actualizaciones del árbol, pero estos efectos desaparecen cuando se elimina la instantánea.

Colecciones Hash

  • HashSet<T>: Una colección utilizando una tabla hash simple para el almacenamiento. El acceso por valor de elemento toma O (1). Como conjunto, no permite duplicados. Proporciona una función BucketCostDistribution() que puede ayudarlo a determinar la eficacia de la función de código hash de los elementos.
  • HashBag<T>: Similar al HashSet<T>, pero tiene una semántica de bolsa, lo que significa que los duplicados están permitidos, pero los duplicados solo se almacenan contando.

cola de prioridad

  • IntervalHeap<T>: Proporciona una cola de prioridad.Encontrar el máximo y el mínimo son O (1) operaciones, eliminar el máximo, mínimo, adición y actualización son O (log n) operaciones. Permite duplicados almacenándolos explícitamente (no contando).

Diccionarios

  • HashDictionary<H,K>: Similar a la SCG.Dictionary<H,K>, proporciona acceso de entrada, inserción y deleción en O (1). También proporciona una función BucketCostDistribution() como HashSet<T> arriba. No garantiza ninguna orden de enumeración particular.
  • TreeDictionary<H,K>: Similar al SCG.SortedDictionary<H,K>, proporciona un diccionario persistentemente ordenado utilizando un árbol rojo-negro. El acceso de entrada, la inserción y la eliminación llevan O (log n). Garantiza que la enumeración del diccionario sigue el orden especificado por el comparador de claves.

Colecciones vigilado

Además, C5 también ofrece colecciones "vigilados", que actúa eficazmente como un envoltorio de sólo lectura, la prevención de la colección de ser modificados. Los elementos de la colección aún pueden modificarse, pero los elementos no se pueden agregar, eliminar o insertar en la colección.

Una respuesta larga, pero completa en las bibliotecas de C5 varias colecciones a su disposición. He encontrado la biblioteca C5 a ser grande y, a menudo usarlo en mi propio código, en sustitución del #header C común con:

using C5; 
using SCG = System.Collections.Generic; 
Cuestiones relacionadas