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ú.
Repita Enumerable no funcionará, ya que repite una referencia al primer objeto en lugar de crear otros nuevos – Aly
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. –