2010-01-09 29 views

Respuesta

5

La forma en que lo está haciendo está bien:

PostType[] q = new PostType[qArray.Length]; 
for (int i = 0; i < q.Length; i++) 
    q[i] = new PostType(); 

Una cosa que he cambiado son para cambiar el nombre del índice veriable de xa i, ya que me parece esto más fácil de leer, aunque es algo subjetivo.

Otra cosa que he cambiado es que la condición de fin del ciclo debe depender de la longitud de q, no de la longitud de qArray. La razón para esto es que con su método, si decide cambiar la primera línea para usar una longitud diferente en lugar de qArray.Length, también debe recordar cambiar la segunda línea. Con el código modificado solo necesita actualizar la primera línea de código y el resto funcionará sin modificaciones.

También puede hacerlo utilizando LINQ:

PostType[] q = Enumerable.Range(0, qArray.Length) 
         .Select(_ => new PostType()) 
         .ToArray(); 

Pero para grandes matrices esto será más lenta y no es realmente más fácil de leer en mi opinión (sobre todo si no han visto antes). Creo que probablemente solo me quedaré con el primer método si fuera tú.

+0

Repita Enumerable no funcionará, ya que repite una referencia al primer objeto en lugar de crear otros nuevos – Aly

+0

funciona Enumerable.Range (que genera un nuevo objeto para cada llamada). Pero desaconsejaría Repetir o Rango, tanto para la legibilidad como para el rendimiento. He actualizado mi comentario con un ejemplo explícito y una explicación de por qué creo que no debería usarlo. –

2

No hay mejor manera si PostType es una clase: es necesario visitar cada posición en la matriz y configurarlo.

Si PostType es una estructura, entonces no necesita hacer nada en absoluto: cada posición en la matriz se inicializa automáticamente al valor predeterminado de la estructura (todos los campos 0). (Pero si quisieras usar un constructor no predeterminado, entonces estarías de vuelta en la misma posición que con las clases; tendrías que visitar cada posición y llamar explícitamente al constructor no predeterminado.)

0

No es que yo pueda pensar off, cuando crea la matriz de memoria se encuentra para ello, aparte de que cada índice apunta a nulo. La mejor manera de hacer que el código sea más eficiente sería la de almacenar qArray.Length en una variable por lo que no llama .length en cada iteración del bucle es decir

int a = qLength 
    for(int x = 0; x < qLength; x++) 
     q[x] = new PostType(); 

Nota: Repita Enumerable no funcionará, ya que crea una instancia del objeto y luego repite una referencia a este objeto.

2

Piece of cake. ¿Por qué no hacer algo como esto? Es conciso

PostType[] q = qArray.Select(i => new PostType()).ToArray(); 
1

Tengo una buena idea, una forma elegante de inicializar matrices de tipo personalizado.

Primero tiene que declarar un método estático para hacer este trabajo en su clase PostType o en una nueva clase.

public class PostType 
{ 
    public static T[] extent<T>(int n) 
    { 
     T[] result = new T[n]; 

     if (!typeof(T).IsValueType) 
     { 
      Type type = typeof(T); 
      object objTSource = Activator.CreateInstance(type); 

      for (int i = 0; i < n; i++) 
      { 
       result[i] = (T)objTSource; 
      } 
     } 

     return result; 
    } 
} 

Por último, es una manera elegante:

PostType[] q = PostType.extent<PostType>(qArray.Length); 
Cuestiones relacionadas