例如
MYCLASS[] myclass = new MYCLASS[10];
现在myclass数组都是空数组,但我想要默认构造数组。我知道我可以为set default构造循环,但我正在寻找更简单方便的方法。
答案 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();