2010-06-07 4 views
5

El código que estoy escribiendo recibe una ArrayList del código no administrado, y este ArrayList siempre contendrá uno o más objetos del tipo Grid_Heading_Blk. Consideré cambiar esta lista de arreglos a una lista genérica, pero no estoy seguro si la operación de conversión será tan costosa como para anular los beneficios de trabajar con la lista genérica. Actualmente, estoy ejecutando una operación foreach (Grid_Heading_Blk in myArrayList) para trabajar con los contenidos de ArrayList después de pasar ArrayList a la clase que lo usará.¿Está convirtiendo este ArrayList en una lista genérica eficiente?

¿Debo convertir ArrayList en una lista genérica? Y si es así, ¿cuál es la forma más eficiente de hacerlo?

Respuesta

2

Aquí hay una puñalada de una manera efectiva de crear una lista genérica de una ArrayList.

List<Grid_Heading_Blk> myList = new List<Grid_Heading_Blk>(source.Count); 
myList.AddRange(source.OfType<Grid_Heading_Blk>()); 

llamando al constructor que acepta un int, el almacenamiento de respaldo se asigna solamente una vez.

Como siempre, debe medir el rendimiento con las herramientas que usa normalmente.

+1

Gracias a todos. Muchas buenas respuestas aquí. Si bien el rendimiento/eficiencia es ciertamente una cuestión clave, es posible que haya estado infravalorando la legibilidad proporcionada por una estructura mecanografiada. Si alguien más finalmente mantiene mi código, quiero que sea lo más claro posible lo que estoy haciendo. – Greg

1

La mayor pena que tiene al utilizar ArrayLists es el boxeo.

Con los genéricos que se obtiene:
1. compilación de seguridad tiempo
2. genéricos extensiones
3. eliminar esta limitación de tener todo en la lista convertido al tipo de objeto.

Estas son las ventajas que tiene al usarlas. Son una ventaja, pero si tiene que volver a llenar el genérico de ArrayList, puede que no valga la pena hacerlo, especialmente si solo está recorriendo la lista para obtener los objetos.

0

"Eficiente" no es una propiedad cualquiera. Es relativo, del mismo modo que un ratón grande probablemente no es más grande que un pequeño elefante.

Depende de qué más esté haciendo.

Su millaje puede variar, pero en mi experiencia, mientras que ArrayList puede ser "más lento" que List<T>, nunca he estado haciendo tan poco como para notarlo de alguna manera.

Dicho esto, es bueno tener el compilador haciendo la verificación de tipos para mí, y es bueno no tener que lanzar cosas.

2

que a menudo utilizan esta lista de verificación para evaluar cuestiones como la suya:

  1. Que sea correcta
  2. Dejar claro
  3. Debe ser precisa
  4. hacerlo eficiente

List<Grid_Heading_Blk> es ahora más revelador de intenciones que ArrayList. Así, sin siquiera considerar la eficiencia, ya hay una gran victoria para el artículo 2.

Para convertir un ArrayList a un List<>, hay que iterar sobre la ArrayList de una vez fundido cada elemento. El foreach está realizando un lanzamiento implícito, por lo que la sobrecarga solo se aplica a la iteración adicional.

Iterar una secuencia dos veces lleva el rendimiento de O(n) a O(2n), que sigue siendo O(n) (la magnitud, no el valor, es lo que importa para el rendimiento). Por lo tanto, puedes considerar el cambio benigno.

Sin embargo, si, literalmente, todo que está haciendo es ejecutar el foreach, sólo debe utilizar directamente ArrayList - cambiándolo a List<> que compra la fuerza de no más expresiva.

0

Si los objetos provienen de código no administrado y no es necesario agregar o eliminar objetos, una matriz de Grid_Heading_Blk podría ser más eficiente que una Lista. Si puede salirse con la suya usando una matriz, usar un bucle for puede ser un poco más rápido que foreach.

2

¿Por qué necesita convertir el ArrayList en absoluto? Para ser honesto, su ciclo foreach parece que funcionaría. Sí, como dice Kevin, la única penalización que pagarías es el desempaquetado, pero tal como está, es un código bastante simple y probablemente no tengas suficientes títulos de cuadrícula para pagar un golpe de rendimiento real.

Pero si debe convertirlo Yo diría que, en lugar de escribir su propio bucle para convertir al tipo genérico de lista, podría ser mejor usar el constructor que toma IEnumerable tipo (algo ArrayList debe aplicar ya.)

List<Grid_Heading_Blk> heading = new List<Grid_Heading_Blk>(arrayList); 
Cuestiones relacionadas