2010-06-12 32 views
5

例如如何使用默認構造函數創建我的類的數組?

MYCLASS[] myclass = new MYCLASS[10]; 

現在MyClass的陣列是所有空數組,但我想有默認的構造陣列。我知道我可以寫一組默認的循環構建但我期待更多的方便和簡單的方法。

+0

如果你有一個結構,那麼你不必初始化每一個項目,因爲它們已經分配一個默認值。 – 2010-06-12 09:55:23

+0

是的,我知道 – Freshblood 2010-06-12 09:58:51

回答

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

沒有更簡單的方法。如果你不喜歡的循環,你可以使用

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

這將使你MyClass類型的4個元素,用默認的構造函數構造一個數組。

否則,您可以選擇使用循環。

如果你不想你想構建你的陣列每次寫循環,你可以創建一個輔助性的方法,例如,作爲一個擴展方法:

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

,然後用它像這樣的:

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

如果你不想寫出來的循環中,您可以使用Enumerable.Range代替:

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

注:這是不是你提到使用一個循環的方法,寫在這裏爲清楚起見相當慢:

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

基準可以在這裏找到:http://dotnetperls.com/initialize-array – 2010-06-12 10:04:00

+0

最好使用新的MYCLASS [10]而不是Enumerable.Range(0,10) http:///stackoverflow.com/questions/3028192/how-can-i-create-array-of-my-class-with-default-constructor/3028257#3028257 – Freshblood 2010-06-12 10:30:00

1

您可以使用LINQ。

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

沒有更好的辦法。你可以這樣做:

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

那麼至少你只需要:

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

這種方法至少應該避免任何重新分配,並且可以使用JIT陣列/長度優化。 : class是爲了避免使用值類型,因爲值類型已經以這種方式初始化;只是new MyValueType[200]會更好。

1

如果我們想要做的所有工作中只有一行代碼,所以這是最好的

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

你應該更新你的答案,而不是提供第二個 – ChrisF 2010-06-12 10:08:28