2010-03-12 17 views
31

Io fondamentalmente voglio conoscere le differenze o vantaggi nell'uso di un elenco generico al posto di un array nello scenario di seguito menzionatoC# array vs elenco generico

class Employee 
{ 
    private string _empName; 

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

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

qualcuno può dirmi la vantaggi o svantaggi e quale preferire?

+9

La classe risulta più pulita se si utilizzano le proprietà implementate automaticamente: stringa pubblica EmployeeName {get; impostato;}. Anche l'utilizzo di nomi completi come EmployeeName sarebbe di aiuto. Oh, e che ne pensi di alcuni tipi? :-) –

risposta

19

Una grande differenza è che List<Employee> può essere espanso (è possibile chiamare Aggiungi su di esso) o contratto (è possibile chiamare Rimuovi su di esso) mentre Impiegato [] è fissato in dimensioni. Pertanto, Employee[] è più difficile da utilizzare, a meno che non sia necessario.

+1

In più con le librerie LINQ, puoi sempre chiamare List.ToArray() se lo fai a un certo punto BISOGNO in un array da qualche parte, quindi l'Elenco ti dà davvero la massima potenza e flessibilità. – eidylon

+3

ToArray() è un metodo incorporato dell'oggetto List precedente a LINQ. LINQ aggiunge un metodo simile a IEnumerables. –

1

Se si conosce il numero di elementi array è una buona scelta. Se non usi la lista. Internamente List<T> utilizza un array di T quindi in realtà sono più simili di quanto si possa pensare.

1

Con un elenco, non è necessario conoscere in anticipo la dimensione dell'array. È possibile aggiungere dinamicamente un nuovo dipendente in base alle esigenze dell'implementazione.

2

È necessario conoscere la dimensione di un array nel momento in cui viene creato, ma non è possibile modificarne le dimensioni dopo che è stato creato.

Quindi, utilizza l'allocazione dinamica della memoria per l'array al momento della creazione. (Questa differisce dalla allocazione di memoria statica usati per matrici C++, in cui la dimensione deve essere nota al momento della compilazione.)

Un elenco può crescere dinamicamente dopo che è stato creato, ed ha la funzione .Add() di farlo.

-from MSDN

  1. Generics Vs Array Lists-SO confronto generale.
  2. Generic List vs Arrays-SO Perché la lista generica è più lenta della matrice?

Quale preferire? List<T>.

7

Con l'elenco generico, è possibile Add/Remove ecc. A basso costo (almeno, all'estremità). Il ridimensionamento di un array (da aggiungere/rimuovere) è più costoso. Lo svantaggio evidente è che una lista ha una capacità inutilizzata, quindi forse spreca pochi byte - non vale la pena preoccuparsi nella maggior parte dei casi, tuttavia (e lo si può tagliare).

Generalmente, preferire gli elenchi a meno che non si sia a conoscere i dati non cambino mai le dimensioni.

API-wise, dal momento che LINQ c'è poco da scegliere tra di essi (ad esempio i metodi aggiuntivi su List<T> sono in gran parte duplicati da LINQ, quindi gli array li ottengono gratuitamente).

Un altro vantaggio è che con una lista non è necessario esporre un setter:

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

eliminando una serie di null insetti, e che consente di mantenere il controllo dei dati (soprattutto se si utilizza un diversa implementazione IList<> che supporta ispezione/convalida quando si modifica il contenuto).

12

La più grande differenza è che gli array non possono essere ingranditi o accorciati una volta creati. Elenca le istanze, tuttavia può avere elementi aggiunti o rimossi. Ci sono anche altre differenze (ad esempio diversi set di metodi disponibili) ma aggiungere/rimuovere è la grande differenza.

mi piace Lista meno che ci sia una buona ragione per usare un array, dal momento che la flessibilità di List è piacevole e la pena perf è molto piccolo rispetto al costo della maggior parte delle altre cose il codice è di solito facendo.

Se vuoi immergerti in molti dettagli tecnici interessanti, consulta this StackOverflow thread che approfondisce la domanda Lista contro Matrice in modo più approfondito.

+6

Questo non li rende immutabili; puoi ancora scambiare i contenuti. Li rende solo di dimensioni fisse. –

+0

Erk, buon punto Marco. Usava erroneamente il termine immutabile. Cambiando ora A proposito, vedo che hai risposto prima ... Ho aggiunto un link alla tua risposta sopra. :-) –

+0

+1 per il collegamento all'altro thread – Danvil

2

Se si espone una raccolta in un'interfaccia pubblica, le linee guida di .NET Framework consigliano di utilizzare un elenco anziché T []. (In effetti, un BindingList < T>)

Internamente, una matrice può essere più appropriata se si dispone di una raccolta di dimensioni fisse e conosciute. Il ridimensionamento di un array è costoso rispetto all'aggiunta di un elemento alla fine di un elenco.