tipo texto tamaño letra fuente forecolor consola como color cambiar c# arrays resize performance arraylist

letra - como cambiar el tamaño del texto de un label en c#



Matriz que se puede cambiar de tamaño rápidamente (5)

Estoy buscando un tipo de tipo de datos de matriz que fácilmente puede agregar elementos, sin un golpe de rendimiento.

  • Sistema. Array - Redim Preserve copia toda la RAM de antigua a nueva, tan lenta como la cantidad de elementos existentes
  • Sistema.Colecciones. ArrayList - ¿es suficiente?
  • Sistema.Colecciones. IList , ¿es suficiente?

¿Qué es "lo suficientemente bueno" para ti? ¿Qué es exactamente lo que quieres hacer con esa estructura de datos?

Ninguna estructura de matriz (es decir, O (n) acceso) permite la inserción en el medio sin un tiempo de ejecución O (n); la inserción al final es O (n) el peor de los casos, una O (1) amortizada para arreglos de auto-cambio de tamaño como ArrayList.

Tal vez las tablas hash (O amortizado (1) de acceso e inserción en cualquier lugar, pero O (n) peor caso de inserción) o árboles (O (log (n)) para el acceso y la inserción en cualquier lugar, garantizado) son más adecuados.


Si su problema es la velocidad, no veo cómo la respuesta seleccionada es mejor que usar una matriz en bruto, aunque se redimensiona a sí misma, usa exactamente el mismo mecanismo que usaría para cambiar el tamaño de una matriz (y debería tomar solo un toque más ) A MENOS que siempre esté agregando al final, en cuyo caso debería hacer las cosas un poco más inteligentes porque asigna un trozo a la vez en lugar de solo un elemento.

Si a menudo agrega cerca del principio / medio de su colección y no indexa en el medio / final muy a menudo, es probable que desee una Lista Vinculada. Eso tendrá el tiempo de inserción más rápido y tendrá un gran tiempo de iteración, simplemente apesta en la indexación (como mirar el tercer elemento desde el final, o el elemento 72).


Solo para resumir algunas estructuras de datos:

System.Collections.ArrayList : las estructuras de datos sin tipo son obsoletas. Use List (of t) en su lugar.

System.Collections.Generic.List (of t) : esto representa una matriz de tamaño variable. Esta estructura de datos utiliza una matriz interna detrás de las escenas. Agregar elementos a la Lista es O (1) siempre que la matriz subyacente no se haya llenado; de lo contrario, es O (n + 1) para cambiar el tamaño de la matriz interna y copiar los elementos.

List<int> nums = new List<int>(3); // creates a resizable array // which can hold 3 elements nums.Add(1); // adds item in O(1). nums.Capacity = 3, nums.Count = 1 nums.Add(2); // adds item in O(1). nums.Capacity = 3, nums.Count = 3 nums.Add(3); // adds item in O(1). nums.Capacity = 3, nums.Count = 3 nums.Add(4); // adds item in O(n). Lists doubles the size of our internal array, so // nums.Capacity = 6, nums.count = 4

Agregar elementos solo es eficiente cuando se agrega al final de la lista. Insertar en el medio obliga a la matriz a desplazar todos los elementos hacia adelante, que es una operación O (n). La eliminación de elementos también es O (n), ya que la matriz necesita desplazar los elementos hacia atrás.

System.Collections.Generic.LinkedList (of t) : si no necesita acceso aleatorio o indexado a los elementos de su lista, por ejemplo, solo planea agregar elementos e iterar del primero al último, entonces LinkedList es su amigo. Las inserciones y eliminaciones son O (1), la búsqueda es O (n).


¿La estructura LinkedList <T> funcionaría para usted? No es (en algunos casos) tan intuitivo como una matriz directa, pero es muy rápido.

  • AddLast para agregar al final
  • AddBefore / AddAfter para insertar en la lista
  • AddFirst para agregar al comienzo

Sin embargo, no es tan rápido para el acceso aleatorio, ya que tiene que iterar sobre la estructura para acceder a sus elementos ... sin embargo, tiene métodos .ToList () y .ToArray () para tomar una copia de la estructura en forma de lista / matriz por lo que para el acceso de lectura, podrías hacer eso en un apuro. El aumento del rendimiento de los insertos puede superar la disminución del rendimiento de la necesidad de acceso aleatorio o no. Dependerá completamente de tu situación.

También hay esta referencia que lo ayudará a decidir cuál es el camino correcto a seguir:

¿Cuándo usar una lista vinculada en una matriz / matriz?


Debe usar la Lista genérica <> ( System.Collections.Generic.List ) para esto. Opera en tiempo amortizado constante .

También comparte las siguientes características con Arrays.

  • Acceso aleatorio rápido (puede acceder a cualquier elemento en la lista en O (1))
  • Es rápido pasar por encima
  • Lento para insertar y eliminar objetos en el inicio o en el medio (ya que tiene que hacer una copia de la lista completa)

Si necesita inserciones y eliminaciones rápidas al principio o al final, use la lista enlazada o las colas