2010-06-12 72 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

相关问题