如何初始化此自定义类型数组:
PostType[] q = new PostType[qArray.Length];
//initialize array
for( int x = 0; x < qArray.Length; x++)
q[x] = new PostType();
有没有更好的方法来初始化这个数组?
答案 0 :(得分:5)
你这样做很好:
PostType[] q = new PostType[qArray.Length];
for (int i = 0; i < q.Length; i++)
q[i] = new PostType();
我改变的一件事是将索引从x重命名为i,因为我发现这更容易阅读,尽管这是一个主观的事情。
我改变的另一件事是for循环结束条件应该取决于q的长度,而不是qArray的长度。这样做的原因是,如果您决定将第一行更改为使用不同的长度而不是qArray.Length,则使用您的方法,您必须记住也要更改第二行。使用修改后的代码,您只需更新第一行代码,其余代码无需修改即可使用。
您也可以使用Linq执行此操作:
PostType[] q = Enumerable.Range(0, qArray.Length)
.Select(_ => new PostType())
.ToArray();
但是对于大型数组而言,在我看来这会慢一点并且不容易阅读(特别是如果你之前没有看过它)。如果我是你,我想我可能会坚持使用第一种方法。
答案 1 :(得分:2)
如果PostType是一个类,没有更好的方法:你需要访问数组中的每个位置并进行设置。
如果PostType是一个结构,那么你根本不需要做任何事情:数组中的每个位置都会自动初始化为struct的默认值(所有字段为0)。 (但是如果你想使用非默认构造函数,那么你将回到与类相同的位置 - 你需要访问每个位置并显式调用非默认构造函数。)
答案 2 :(得分:2)
一块蛋糕。为什么不做这样的事情。这很简洁。
PostType[] q = qArray.Select(i => new PostType()).ToArray();
答案 3 :(得分:1)
实际上没有更好的方法可以做到这一点。请参阅http://dotnetperls.com/initialize-array
还有其他几种方法,但简单的循环显着更快
答案 4 :(得分:1)
我有一个好主意,一种初始化数组自定义类型的优雅方法。
首先,您必须声明一个静态方法,以便在PostType类或新类中执行此作业。
public class PostType
{
public static T[] extent<T>(int n)
{
T[] result = new T[n];
if (!typeof(T).IsValueType)
{
Type type = typeof(T);
object objTSource = Activator.CreateInstance(type);
for (int i = 0; i < n; i++)
{
result[i] = (T)objTSource;
}
}
return result;
}
}
最后,这是一种优雅的方式:
PostType[] q = PostType.extent<PostType>(qArray.Length);
答案 5 :(得分:0)
不是我能想到,当你为它创建数组内存时,除了每个索引都指向null。使代码更高效的最佳方法是将qArray.Length
存储到变量中,这样就不会在每次循环迭代时调用.length。
int a = qLength
for( int x = 0; x < qLength; x++)
q[x] = new PostType();
注意:Enumerable Repeat不起作用,因为它创建了一个对象实例,然后重复对该对象的引用。