Pregunta

A menudo uso un ArrayList en lugar de un array[].

Siento que estoy haciendo trampa (o que soy flojo) cuando uso un <=>, ¿cuándo está bien usar un <=> sobre una matriz?

¿Fue útil?

Solución

Las matrices están fuertemente tipadas y funcionan bien como parámetros. Si conoce la longitud de su colección y está arreglada, debe usar una matriz.

Las ArrayLists no están fuertemente tipadas, cada Inserción o Retrial necesitará un reparto para volver a su tipo original. Si necesita un método para tomar una lista de un tipo específico, ArrayLists se queda corto porque puede pasar una ArrayList que contenga cualquier tipo. ArrayLists usa una matriz que se expande dinámicamente internamente, por lo que también existe un golpe para expandir el tamaño de la matriz interna cuando alcanza su capacidad.

Lo que realmente quieres usar es una lista genérica como List<T>. Esto tiene todas las ventajas de Array y ArrayLists. Está fuertemente tipado y admite una longitud variable de elementos.

Otros consejos

Además de la respuesta de Bob y Frederick, me gustaría señalar que, si bien las matrices tienen covarianza, las listas genéricas no. Por ejemplo, una matriz de tipo MyChildClass[] se puede convertir fácilmente a MyParentClass[], mientras que List<MyChildClass> no se puede convertir a List<MyParentClass>, al menos no directamente.

Si necesita covarianza, use matrices, use el método Cast () de LINQ o algún otro medio para lanzar cada elemento individualmente o espere C # 4 .

Otro pensamiento aquí es la mutación; una matriz (T[]) es completamente mutable y no se puede proteger. List<T> no proporciona ningún punto de extensión útil, pero cosas como Collection<T> (o muchas otras implementaciones de IList<T>) le permiten agregar código, por ejemplo, para verificar elementos antes de agregarlos; Del mismo modo, puede tener params implementaciones de solo lectura, lo que es útil para la seguridad de subprocesos donde la inmutabilidad es deseable.

Tiendo a usar matrices en lógica de método interno (tal vez como una variable local), como argumentos <=>, o en algunos casos altamente optimizados donde sé la longitud de los elementos y sé el código elige no mutarlo (como un campo privado). Aparte de eso, <=> etc. tienden a ser más comunes, ya que tienen mucho menos gastos generales al agregar / eliminar elementos.

A menos que esa parte del código sea absolutamente crítica para el rendimiento, usar ArrayList está perfectamente bien.

Mejor aún, donde sea que use ArrayList, use la colección genérica List<T> en su lugar. Está más fuertemente tipado que el anterior.

Estoy respondiendo esto desde una perspectiva de Java, pero es el mismo problema básico. No debes sentirte culpable usando abstracciones más altas. Después de todo, ¿está utilizando String s en lugar de char[], o incluso byte[]? Incluso sugiero ir un paso más allá y usar la interfaz List cuando sea posible. La única razón para bajar un paso es por razones de rendimiento.

Usar la abstracción de colección más alta tiene muchas ventajas. Puede agregar decoradores para hacer que la Lista sea de solo lectura, hacerla de tamaño fijo, verificar los elementos que ingresan o salen de la colección o usar vistas (vea GetRange en C # y subList en Java).

Por cierto, un ArrayList siempre debe basarse en una matriz primitiva, de lo contrario el nombre es incorrecto. Las operaciones generalmente se implementan exactamente como se esperaría al usar una matriz primitiva. Si se usa una lista vinculada, generalmente se llama así: LinkedList. Esa también es una ventaja de usar la interfaz: puede cambiar de opinión sobre la implementación utilizada más adelante.

Hay algunas cosas que hacen que el uso de colecciones sea torpe. Una advertencia es que las colecciones generalmente se basan en objetos, y los lenguajes tienen una brecha considerable entre los tipos primitivos y de objetos. Los genéricos limitados tampoco ayudan mucho. Aún así, recomiendo las colecciones sobre los arreglos a menos que haya una buena razón de lo contrario.

Para valores primitivos, también puede considerar usar una biblioteca de colección primitiva, por ejemplo GNU Trove . Sin embargo, no sé si hay algo similar para C #.

Fabulous Adventures In Coding ha escrito una pieza Las matrices se consideran algo dañinas . Es una lectura realmente interesante.

Bueno, para empezar, si solo tiene la intención de manejar un tipo específico, no debe usar una ArrayList. Por ejemplo, si solo espera una matriz de bytes, solo debe aceptar una matriz de bytes.

El único momento en el que pensaría que incluso puedes pensar en usar una ArrayList es en lugar de List.

El tamaño de la matriz es estático, por lo que si conoce el tamaño en tiempo de diseño, use la matriz. Se supone que funciona más rápido, pero no lo he probado yo mismo. Si necesita cambiar el recuento de objetos con frecuencia (agregar o eliminar objetos de la colección) use ArrayList o mejor la Lista genérica de .NET 2. También es más fácil de usar, por lo que si el rendimiento no es crucial, siempre puede usar Lista.

Si necesita una variedad de tipos primitivos, use Array para un mejor rendimiento, ya que evitará el autoboxing y unboxing. Pero solo si conoce el tamaño que desea con anticipación.

Es así.

using System;
using System.Collections;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //ArrayList
            /*
             An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects      
             */
            ArrayList list = new ArrayList();
            list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
            list.Add(1);
            list.Add(1.25);

            //Array
            /*
             must declare length.
             */
            string[] array = new string[3]; // you must declare object types
            array[0] = "1";
            //array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
            array[2] = "stongly typed";
            Console.WriteLine("------- ARRAYLIST ITEMS ---------");
            foreach (var i in list) {
                Console.WriteLine(i);
            }

            Console.WriteLine("--------- ARRAY ITEMS -----------");
            foreach (var i in array)
            {
                Console.WriteLine(i);
            }

            Console.ReadKey(); 
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top