如何使用默认构造函数创建我的类的数组?

时间:2010-06-12 09:40:49

标签: c# .net arrays constructor

例如

MYCLASS[] myclass = new MYCLASS[10];

现在myclass数组都是空数组,但我想要默认构造数组。我知道我可以为set default构造循环,但我正在寻找更简单方便的方法。

6 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:2)

没有一种更简单的方法。如果您不喜欢循环,可以使用

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

它将为您提供一个包含4个MyClass类型元素的数组,使用默认构造函数构建。

否则,您可以选择使用循环。

如果您不想在每次构建数组时都编写该循环,则可以创建一个辅助方法,例如作为扩展方法:

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

答案 2 :(得分: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]会更好。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

您可以使用LINQ。

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

答案 5 :(得分:1)

如果我们只想在一个行代码中完成所有工作,那么这是最好的

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