2009-07-09 13 views
38

Estoy creando una nueva lista C# (List<double>). ¿Hay alguna manera, aparte de hacer un ciclo sobre la lista, para inicializar todos los valores de inicio a 0?Inicialización automática de listas C#

+0

esto es factible, pero las listas en .net no tienen un tamaño definido, por lo que su tipo de puntos de acceso – DevelopingChris

Respuesta

49

Además de las soluciones funcionales proporcionados (utilizando los métodos estáticos en la clase Enumerable), puede pasar una matriz de double s en el constructor.

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

Esto funciona porque el valor predeterminado de un double ya es 0, y probablemente realiza un poco mejor.

+3

Sospecho que en realidad funcionará un poco peor. El constructor 'List ' copia su matriz, por lo que este método asigna dos matrices. El método LINQ usa un iterador sin asignar mucha memoria.Por otro lado, al darle una matriz le permitirá usar el tamaño correcto, lo que ahorrará un cambio de tamaño de la matriz si hay más elementos que la capacidad predeterminada para 'List '. (8, IIRC) – SLaks

+0

@SLaks, punto interesante. Supongo que tienes razón. Probablemente depende del tamaño inicial. Para tamaños iniciales más pequeños, el enfoque funcional es probablemente un poco más eficiente, donde los tamaños iniciales más grandes definitivamente funcionarían mejor con el inicializador de matriz. Al final, sin embargo, supongo que la afirmación de rendimiento es probablemente académica en el mejor de los casos, ya que probablemente nunca hará una diferencia en una aplicación de producción real. –

+0

Una solución muy inteligente y eficiente. –

35

Puede utilizar el inicializador:

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

Por lo que podría estar usando esto:

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

De lo contrario, utilizando el constructor por defecto, la lista estará vacía.

+1

"De lo contrario, utilizando el constructor predeterminado, la lista se inicializará con 0 elementos". Para que quede claro, la lista estará vacía, no es que tenga todas las entradas establecidas en el valor predeterminado. – jason

+0

Lo siento ... mi inglés no es muy bueno –

+2

Tenga en cuenta que esto solo funcionará en VS2008/C# 3/VB9 y no en las versiones anteriores (VS2005/C# 2/VB8) – CraigTP

31

Usar este código:

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

Creo que esto es más lo que el OP está buscando. –

+3

El primero debe ser var list = Enumerable.Repeat (0d, 25) .ToList(); – jason

-4

Para los tipos más complejos:

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

desde aquí: David Hayden's Blog

+1

esto no ofrece ninguna ayuda para tratar con valores predeterminados para dobles. – ddc0660

14

Una posibilidad es utilizar :

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

Otra es:

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

esto es más como eso. –

+0

Esto es bueno porque el segundo ejemplo se puede usar en C# 2.0. –

2

Un poco tarde, pero tal vez siendo de interés: mediante LINQ, tratar

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

... espero evitar la copia de la lista (que es hasta ahora LINQ).

Esto debería ser un comentario a la respuesta de Michael Meadows, pero me falta reputación.

Cuestiones relacionadas