2010-03-12 10 views
31

básicamente quiero saber las diferencias o ventajas en el uso de una lista genérica en lugar de una matriz en el escenario mencionado a continuaciónC# arsenal vs lista genérica

class Employee 
{ 
    private string _empName; 

    public string EmpName 
    { 
     get{ return _empName; } 
     set{ _empName = value; } 
    } 
} 

1. Employee[] emp 
2. List<Employee> emp 

Puede alguien por favor dígame el ventajas o desventajas y cuál preferir?

+9

Su clase sería más limpia si utilizó Propiedades auto-implementadas: public string EmployeeName {get; conjunto;}. Usar nombres completos como EmployeeName ayudaría también. Ah, y ¿qué tal algunos tipos también? :-) –

Respuesta

19

Una gran diferencia es que List<Employee> se puede expandir (puede llamar a Agregar) o contraerse (puede llamar a Eliminar en él) mientras que Empleado [] tiene un tamaño fijo. Por lo tanto, Employee[] es más difícil de usar a menos que la necesidad lo requiera.

+1

Además con las bibliotecas LINQ, siempre puede llamar a List.ToArray() si lo hace en algún momento NECESITARlo en una matriz en alguna parte, por lo que la lista realmente le da la mejor potencia y flexibilidad. – eidylon

+3

ToArray() es un método integrado del objeto List que es anterior a LINQ. LINQ agrega un método similar a IEnumerables. –

1

Si conoce el número de elementos, la matriz es una buena opción. Si no, usa la lista. Internamente, List<T> usa una matriz de T, por lo que son más parecidos a lo que piensas.

1

Con una lista, no es necesario que conozca el tamaño de la matriz de antemano. Puede agregar dinámicamente nuevos empleados según las necesidades de su implementación.

2

Necesita saber el tamaño de una matriz en el momento en que se creó, pero no puede cambiar su tamaño una vez que se haya creado.

Por lo tanto, utiliza la asignación de memoria dinámica para la matriz en el momento de la creación. (Esto difiere de la asignación de memoria estática y usadas para las matrices C++, donde el tamaño debe ser conocido en tiempo de compilación.)

Una lista puede crecer dinámicamente después de que ha sido creado, y tiene la función de .Add() de hacer eso.

-from MSDN

  1. Generics Vs Array Lists-SO comparación general.
  2. Generic List vs Arrays-SO ¿Por qué la lista genérica es más lenta que la matriz?

¿Cuál prefiere? List<T>.

7

Con la lista genérica, puede Add/Remove etc. a bajo precio (al menos, al final). Cambiar el tamaño de una matriz (para agregar/eliminar) es más caro. El inconveniente obvio es que una lista tiene capacidad extra, por lo que quizás desperdicie unos pocos bytes, aunque no vale la pena preocuparse en la mayoría de los casos (y puede recortarla).

En general, preferir listas a menos que sepa sus datos nunca cambian de tamaño.

API-wise, ya que LINQ hay poco para elegir entre ellos (es decir, los métodos adicionales en List<T> son en gran medida duplicados por LINQ, por lo que los arrays los obtienen de forma gratuita).

Otra ventaja es que con una lista que no es necesario para exponer un colocador:

private readonly List<Foo> items = new List<Foo>(); 
public List<Foo> Items { get { return items; } } 

eliminación de una serie de null errores, y que le permite mantener el control sobre los datos (especialmente si se utiliza una implementación diferente de IList<> que admite la inspección/validación cuando se cambian los contenidos).

12

La mayor diferencia es que las matrices no se pueden alargar ni acortar una vez que se han creado. Las instancias de lista, sin embargo, pueden tener elementos agregados o eliminados. También existen otras diferencias (por ejemplo, diferentes conjuntos de métodos disponibles), pero agregar/eliminar es la gran diferencia.

Me gusta la Lista a menos que haya una buena razón para usar una Matriz, ya que la flexibilidad de la Lista es agradable y la penalización es muy pequeña en relación con el costo de la mayoría de las cosas que normalmente hace su código.

Si desea profundizar en muchos detalles técnicos interesantes, consulte this StackOverflow thread que profundiza en la cuestión de la lista frente a la matriz con más profundidad.

+6

Eso no los hace inmutables; aún puedes intercambiar contenidos. Simplemente los hace de tamaño fijo. –

+0

Erk, buen punto Mark. Fue un mal uso del término inmutable. Cambiando ahora. Por cierto, veo que has respondido esto antes ... Agregué un enlace a tu respuesta anterior. :-) –

+0

+1 para el enlace al otro hilo – Danvil

2

Si está exponiendo una colección en una interfaz pública, las Pautas de .NET Framework recomiendan utilizar una Lista en lugar de T []. (De hecho, un BindingList < T>)

Internamente, una matriz puede ser más apropiada si tiene una colección que es un tamaño fijo y conocido. Cambiar el tamaño de una matriz es costoso en comparación con agregar un elemento al final de una lista.