2009-07-09 8 views
38

Sto creando un nuovo elenco C# (List<double>). C'è un modo, oltre a fare un ciclo sull'elenco, per inizializzare tutti i valori iniziali su 0?Auto-inizializzazione delle liste C#

+0

questo è fattibile, ma gli elenchi in .net non hanno una dimensione definita, quindi il suo tipo di pointletss – DevelopingChris

risposta

49

Oltre alle soluzioni funzionali previsti (utilizzando i metodi statici sulla classe Enumerable), si può passare un array di double s nel costruttore.

var tenDoubles = new List<double>(new double[10]); 

Questo funziona perché il valore predefinito di un double è già 0, e probabilmente svolge un po 'meglio.

+3

Sospetto che funzionerà leggermente peggio. Il costruttore 'List ' copia il suo array, quindi questo metodo alloca due array. Il metodo LINQ utilizza un iteratore senza allocare molta memoria.D'altra parte, dargli una matrice gli permetterà di usare la dimensione corretta, che salverà un ridimensionamento dell'array se ci sono più elementi della capacità predefinita per 'Lista '. (8, IIRC) – SLaks

+0

@SLaks, punto interessante. Suppongo che tu abbia ragione. Probabilmente dipende dalle dimensioni iniziali. Per dimensioni iniziali minori, l'approccio funzionale è probabilmente leggermente più efficiente, in cui le dimensioni iniziali più grandi potrebbero sicuramente migliorare con l'inizializzatore di array. Alla fine, tuttavia, suppongo che l'affermazione delle prestazioni sia probabilmente accademica nella migliore delle ipotesi, poiché probabilmente non farà mai la differenza in una vera app di produzione. –

+0

Una soluzione molto intelligente ed efficiente. –

35

È possibile utilizzare l'inizializzatore:

var listInt = new List<int> {4, 5, 6, 7}; 
var listString = new List<string> {"string1", "hello", "world"}; 
var listCustomObjects = new List<Animal> {new Cat(), new Dog(), new Horse()}; 

Così si potrebbe utilizzare questo:

var listInt = new List<double> {0.0, 0.0, 0.0, 0.0}; 

In caso contrario, utilizzando il costruttore di default, l'elenco sarà vuoto.

+1

"Altrimenti, usando il costruttore predefinito, l'Elenco sarà inizializzato con 0 elementi." Per essere chiari, la lista sarà vuota, non che avrà tutte le voci impostate sul valore predefinito. – jason

+0

Scusa ... il mio inglese non è molto bello –

+2

Ricorda che questo funzionerà solo in VS2008/C# 3/VB9 e non nelle versioni precedenti (VS2005/C# 2/VB8) – CraigTP

31

di questo codice:

Enumerable.Repeat(0d, 25).ToList(); 
new List<double>(new double[25]);  //Array elements default to 0 
+0

Penso che questo sia più ciò che l'OP sta cercando. –

+3

Il primo dovrebbe essere var list = Enumerable.Repeat (0d, 25) .ToList(); – jason

-4

Per i tipi più complessi:

List<Customer> listOfCustomers = 
     new List<Customer> { 
      { Id = 1, Name="Dave", City="Sarasota" }, 
      { Id = 2, Name="John", City="Tampa" }, 
      { Id = 3, Name="Abe", City="Miami" } 
     }; 

da qui: David Hayden's Blog

+1

questo non offre alcun aiuto con i valori di default per i doppi. – ddc0660

14

Una possibilità è quella di utilizzare :

int capacity; 
var list = Enumerable.Range(0, capacity).Select(i => 0d).ToList(); 

Un altro è:

int capacity; 
var list = new List<double>(new double[capacity]); 
+0

questo è più simile. –

+0

Ciò è positivo perché il secondo esempio può essere utilizzato in C# 2.0. –

2

un po 'tardi, ma forse ancora di interesse: utilizzando LINQ, provare

var initializedList = new double[10].ToList()

... speriamo di evitare la copia della lista (che sta a LINQ ora).

Questo dovrebbe essere un commento alla risposta di Michael Meadows, ma mi manca la reputazione.