2010-06-12 6 views
5

Zum BeispielWie kann ich Array meiner Klasse mit Standardkonstruktor erstellen?

MYCLASS[] myclass = new MYCLASS[10]; 

Jetzt ist myclass Array alle null Array, aber ich möchte Standard aufgebaut Array haben .I weiß, dass ich Schleifen für Satz Standard aufgebaut schreiben kann, aber ich bin auf der Suche nach mehr leichte und einfache Art und Weise.

+0

Wenn Sie eine Struktur haben, dann müssen Sie nicht jedes Element initialisieren, als sie ohnehin schon sind mit einem Standardwert zugewiesen. –

+0

Ja, ich weiß, dass – Freshblood

Antwort

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

Es gibt keinen einfacheren Weg. Wenn Sie nur Schleifen nicht mögen, könnten Sie

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

verwenden, die ein Array mit 4 Elementen vom Typ MyClass, gebaut mit dem Standard-Konstruktor geben würden.

Ansonsten haben Sie nur die Möglichkeit, eine Schleife zu verwenden.

Wenn Sie nicht, dass Schleife wollen jedes Mal, wenn Sie schreiben wollen Ihr Array erstellen, können Sie eine Helfer-Methode, zum Beispiel als Erweiterung Methode erstellen:

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

und dann verwenden, wie dies:

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

Wenn Sie nicht über die Schleife schreiben wollen könnten Sie Enumerable.Range statt:

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

Hinweis: es ist wesentlich langsamer als die Methode, die Sie mit einer Schleife erwähnt, geschrieben hier für Klarheit:

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

Benchmark hier gefunden werden kann: http://dotnepperls.com/initialize-array –

+0

Es ist besser, neue MYCLASS [10] anstelle von Enumerable.Range (0,10) http:/zu verwenden /stackoverflow.com/questions/3028192/how-can-i-create-array-of-my-class-with-default-constructor/3028257#3028257 – Freshblood

1

Sie LINQ verwenden können.

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

Es gibt nicht wirklich einen besseren Weg. Man könnte so etwas wie tun:

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

dann zumindest müssen Sie nur:

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

Dieser Ansatz zumindest keine Umschichtungen vermeiden sollte, und kann die JIT-Array/Längenoptimierung nutzen. Die : class soll mit Value-Typen nicht verwendet werden, da mit Value-Typen bereits auf diese Weise initialisiert wird; nur new MyValueType[200] wäre besser.

1

Wenn wir alle Jobs in nur eine Zeile Code tun wollen, so ist dies am besten

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

Sie sollten Ihre Antwort aktualisiert haben, anstatt eine zweite zur Verfügung zu stellen – ChrisF

Verwandte Themen