2010-06-12 7 views
5

Por ejemplo¿Cómo puedo crear una matriz de mi clase con el constructor predeterminado?

MYCLASS[] myclass = new MYCLASS[10]; 

Ahora miclase matriz es todo matriz nula, pero quiero tener la matriz por defecto construida .I sé que puedo escribir bucles para set default construyó pero estoy en busca de manera más fácil y sencilla.

+0

Si usted tiene una estructura, entonces usted no tiene que inicializar cada artículo, puesto que ya están asignado con un valor predeterminado. –

+0

Sí, sé que – Freshblood

Respuesta

2
var a = Enumerable.Repeat(new MYCLASS(), 10).ToArray(); 
2

No hay una manera más fácil. Si simplemente no les gusta bucles, se puede utilizar

MyClass[] array = new[] { new MyClass(), new MyClass(), new MyClass(), new MyClass() }; 

lo que le daría una matriz con 4 elementos de tipo MiClase construidas con el constructor por defecto.

De lo contrario, solo tiene la opción de utilizar un bucle.

Si no desea escribir ese bucle cada vez que quiera construir la matriz, se puede crear un ayudante-método, por ejemplo, como un método de extensión:

static class Extension 
{ 
    public static void ConstructArray<T>(this T[] objArray) where T : new() 
    { 
     for (int i = 0; i < objArray.Length; i++) 
      objArray[i] = new T(); 
    } 
} 

y luego usarlo como esto:

MyClass[] array = new MyClass[10]; 
array.ConstructArray(); 
6

Si no desea escribir el bucle se puede utilizar en lugar Enumerable.Range:

MyClass[] a = Enumerable.Range(0, 10) 
         .Select(x => new MyClass()) 
         .ToArray(); 

Nota: es considerablemente más lento que el método que ha mencionado el uso de un bucle, escrito aquí para mayor claridad:

MyClass[] a = new MyClass[10]; 
for (int i = 0; i < a.Length; ++i) 
{ 
    a[i] = new MyClass(); 
} 
+0

Benchmark se puede encontrar aquí: http://dotnetperls.com/initialize-array –

+0

Es mejor usar el nuevo MYCLASS [10] en lugar de Enumerable.Range (0,10) http://stackoverflow.com/questions/3028192/how-can-i-create-array-of-my-class-with-default-constructor/3028257#3028257 – Freshblood

1

Puede utilizar LINQ.

var a = (from x in Enumerable.Range(10) select new MyClass()).ToArray(); 
2

No hay realmente una mejor manera. Se podría hacer algo como:

public static T[] CreateArray<T>(int len) where T : class, new() { 
    T[] arr = new T[len]; 
    for(int i = 0 ; i <arr.Length ; i++) { arr[i] = new T(); } 
    return arr; 
} 

entonces por lo menos sólo es necesario:

Foo[] data = CreateArray<Foo>(150); 

Este enfoque debería, al menos, evitar cualquier reasignaciones, y puede utilizar la optimización gama JIT/longitud. El : class es para evitar el uso con tipos de valores, ya que los tipos de valores ya se inicializan de esta manera; solo new MyValueType[200] sería mejor.

1

Si queremos hacer todo el trabajo en una sola línea de código por lo que este es el mejor

MYCLASS[] myclass = (new MYCLASS[10]).Select(x => new MYCLASS()).ToArray(); 
+1

Debes haber actualizado tu respuesta en lugar de proporcionar una segunda – ChrisF

Cuestiones relacionadas