2010-03-30 9 views
5

Considere el siguiente código:Eficiencia: ¿Crear una matriz de dobles incrementalmente?

List<double> l = new List<double>(); 

//add unknown number of values to the list 
l.Add(0.1); //assume we don't have these values ahead of time. 
l.Add(0.11); 
l.Add(0.1); 

l.ToArray(); //ultimately we want an array of doubles 

alguna irregularidad con este enfoque? ¿Hay alguna manera más apropiada de construir una matriz, sin conocer el tamaño o los elementos antes de tiempo?

Respuesta

8

No hay nada de malo con su enfoque. Está utilizando el tipo de datos correcto para este fin.

+0

Sé que esta pregunta es antigua, y podría estar equivocado acerca de esto, pero me parece que el OP estaba preguntando sobre la declaración 'l.ToArray();', como me he preguntado al respecto también.Si tiene que crear una nueva estructura de datos y luego copiar todos los datos y destruir el original, de hecho no es tan eficiente. Sería mucho más eficiente devolver la 'Lista ' o cualquier otro tipo de datos que no necesite copiarse ni convertirse. –

-1

Una estructura de datos dinámica como una lista es la forma correcta de implementar esto. Las únicas matrices de ventaja real sobre una Lista son el rendimiento de acceso O (1) (en comparación con O (n) en Lista). La flexibilidad más que compensa esta pérdida de rendimiento imho

+4

La lista es O (1) para acceder, internamente, es una matriz que crece dinámicamente en tamaño. –

+1

La lista <> no está enlazada. – ima

+0

¡Soy corregido y educado! –

3

Después de algunas observaciones, puede tener una mejor idea de los elementos totales en esa lista. A continuación, puede crear una nueva lista con una capacidad inicial en el constructor:

List<double> l = new List<double>(capacity); 

Aparte de esto, es la estructura técnica y datos adecuada.


ACTUALIZACIÓN:

Si:

  • sólo necesitan los Add y ToArray funciones de la estructura List<T>,
  • Y realmente no se puede predecir la capacidad total
  • Y terminas con más de 1K elementos
  • y un mejor rendimiento es muy, muy (de verdad!) Su objetivo

entonces puede que desee para escribir su propia interfaz:

public interface IArrayBuilder<T> 
{ 
    void Add(T item); 
    T[] ToArray(); 
} 

y luego escribir su propia implementación, lo que podría ser mejor que List<T>. ¿Porqué es eso? porque List<T> contiene una única matriz internamente y aumenta su tamaño cuando es necesario. El procedimiento para aumentar los costos de la matriz interna, en términos de rendimiento, ya que asigna nueva memoria (y tal vez copia los elementos de la matriz anterior a la nueva, no recuerdo). Sin embargo, si todas las condiciones descritas arriba son verdaderas, todo lo que necesita es construir una matriz, realmente no necesita todos los datos para ser almacenados en una sola matriz internamente.

Sé que es una posibilidad remota, pero yo creo que es mejor compartir esos pensamientos ...

0

Como otros ya han señalado: Este es el enfoque correcto. Solo agregaré que si de alguna manera puede evitar la matriz y usar List<T> directamente o quizás IEnumerable<T>, evitará copiar la matriz como ToArray realmente copia la matriz interna de la instancia de la lista.

Eric Lippert tiene un gran post about arrays, que puede ser relevante.

Cuestiones relacionadas