Utilizo a menudo un ArrayList en lugar de un ‘normal’ array[].

Me siento como si me estoy engañando (o pereza) cuando yo uso una ArrayList, cuando está bien usar un ArrayList a través de una matriz?

  • Eso no es hacer trampa, que es hacer su vida más fácil. Usted debe hacer su vida más fácil, siempre que sea posible.
InformationsquelleAutor inspite | 2009-01-05

11 Comentarios

  1. 61

    Matrices con establecimiento inflexible de tipos, y el trabajo así como los parámetros. Si conoces la longitud de su colección y es fijo, usted debe utilizar una matriz.

    ArrayLists no son inflexibles, cada Inserción o nuevo Juicio se necesita un molde para volver a su tipo original. Si usted necesita un método para tomar una lista de un tipo específico, ArrayLists quedan cortos, ya que podría pasar en un ArrayList que contiene cualquier tipo. ArrayLists utilizar una expansión dinámica de la matriz internamente, por lo que también es un golpe para ampliar el tamaño de la matriz interna cuando golpea a su capacidad.

    Lo que quiere realmente es una lista genérica como List<T>. Este tiene todas las ventajas de una Matriz y la ArrayLists. Es inflexible y es compatible con una longitud variable de los elementos.

    • Un ArrayList no utilizar una LinkedList como la estructura de datos interna! Se utiliza un vector que es una matriz que es cambiar de tamaño dinámicamente en añadir/insertar/eliminar de operaciones.
    • Buena captura, ha sido un tiempo desde que me parecía que hasta. He corregido la respuesta.
  2. 14

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

    Si usted necesita covarianza, ya sea el uso de matrices, el uso de LINQ Cast() método o algún otro medio para emitir cada elemento de forma individual o esperar a C# 4.

    • C# 4 no ofrecen covarianza para las listas sólo IEnumerable<T> (y un par de delegados) – exige estricta «en» xor «fuera de uso», y la Lista de<T> tiene tanto «en» y «fuera de uso».
    • Marc: ya veo, gracias por la aclaración.
  3. 7

    Otro pensamiento aquí es la mutación, una matriz (T[]) es totalmente mutable, y no puede ser protegida. List<T> no brinda una útil extensión de puntos, pero las cosas como Collection<T> (o muchos otros IList<T> implementaciones) permite agregar código, por ejemplo, para revisar los artículos antes de que se agregan; de la misma manera, usted puede tener readonly IList<T> implementaciones, que es útil para la seguridad de los subprocesos donde la inmutabilidad es deseable.

    Que tienden a usar matrices, ya sea en la interna de la lógica del método (tal vez como una variable local), como params argumentos, o en algunos altamente optimizado de los casos que conozco la longitud de los elementos, y sé que el código elige no para de mutar (como un campo privado). Aparte de eso, List<T> etc tienden a ser más comunes, ya que tienen mucho menos sobrecarga cuando la adición o eliminación de elementos.

  4. 5

    A menos que esa parte del código es absolutamente cruciales para el rendimiento, el uso de ArrayList está perfectamente bien.

    • Así, en 1.1 tal vez… en general usted debe apuntar para la Lista de<T> en 2.0
  5. 4

    Mejor aún, dondequiera que se use ArrayList, el uso de la List<T> colección genérica en su lugar. Es el tipo más fuerte que la anterior.

  6. 1

    Estoy respondiendo esto a partir de una perspectiva Java, pero es el mismo tema básico. Usted no debe sentirse culpable utilizando altas abstracciones. Después de todo, usted está utilizando Strings en lugar de char[], o incluso byte[]? Incluso me sugieren ir un paso más allá y utilizar el List interfaz donde sea posible. La única razón para ir un paso hacia abajo es por razones de rendimiento.

    El uso de la mayor colección de abstracción tiene muchas ventajas. Usted puede agregar los decoradores para hacer la Lista de sólo lectura, hacen de tamaño fijo, compruebe los elementos que entran o salen de la recopilación o el uso de vistas (ver GetRange en C# y subList en Java.)

    Por el camino, un ArrayList debe estar siempre basado en una primitiva de la matriz, de lo contrario, el nombre está mal. Las operaciones son generalmente implementadas sólo como era de esperar cuando se utiliza una primitiva de la matriz. Si una lista enlazada se utiliza es generalmente nombrado sólo eso — LinkedList. Eso también es una ventaja de usar la interfaz: Usted puede cambiar su mente sobre la implementación de la tarde.

    Hay un par de cosas que hacen que la utilización de las colecciones torpe. Una limitación es que las colecciones se basan, generalmente, en los objetos, y los idiomas tienen una brecha considerable entre los primitivos y los tipos de objeto. La limitada genéricos no ayuda mucho. Aún así, recomiendo a las colecciones a través de matrices, a menos que exista una buena razón para lo contrario.

    Para valores primitivos también puede considerar el uso de una primitiva de la colección de la biblioteca, por ejemplo GNU Tesoro. No sé si hay algo similar para C#, aunque.

  7. 0

    Bueno para uno, si usted sólo tiene la intención de manejar un tipo específico, que no se debe usar un ArrayList. Por ejemplo, si usted sólo esperan una matriz de bytes, sólo debe aceptar una matriz de bytes.

    Sólo el tiempo yo creo que incluso puede pensar en el uso de un ArrayList es lugar de la Lista.

  8. 0

    De la matriz de tamaño es estático, por lo que si usted sabe el tamaño en tiempo de diseño, el uso de la matriz. Se supone que es para trabajar más rápido, pero yo no lo he probado yo mismo. Si necesita cambiar el número de objetos con frecuencia (añadir o eliminar objetos de la colección) usar ArrayList o mejor dicho, la Lista genérica de .NET 2. Es también más fácil de utilizar, por lo que si el rendimiento no es importante, siempre se puede usar la Lista.

  9. 0

    Si usted necesita una matriz de tipos primitivos uso de la Matriz para un mejor rendimiento, puesto que evita la autoboxing y unboxing. Pero sólo si usted sabe el tamaño que usted quiere antes de tiempo.

  10. 0

    Es Como este.

    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(); 
            }
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here