如何初始化数组自定义类型的:如何初始化与自定义类型阵列
PostType[] q = new PostType[qArray.Length];
//initialize array
for(int x = 0; x < qArray.Length; x++)
q[x] = new PostType();
是否有更好的方法来初始化这个数组?
如何初始化数组自定义类型的:如何初始化与自定义类型阵列
PostType[] q = new PostType[qArray.Length];
//initialize array
for(int x = 0; x < qArray.Length; x++)
q[x] = new PostType();
是否有更好的方法来初始化这个数组?
你正在做它的方式是好的:
PostType[] q = new PostType[qArray.Length];
for (int i = 0; i < q.Length; i++)
q[i] = new PostType();
有一件事我已经改变了对veriable从X重命名索引我,因为我觉得这更容易阅读,虽然这是一个主观的东西。
我改变的另一件事是for循环结束条件应该取决于q的长度,而不是qArray的长度。原因是,如果您决定将第一行更改为使用不同的长度而不是qArray.Length,那么对于您的方法,您必须记得更改第二行。使用修改后的代码,您只需更新第一行代码,其他代码将无需修改即可使用。
你也可以做到这一点使用LINQ:
PostType[] q = Enumerable.Range(0, qArray.Length)
.Select(_ => new PostType())
.ToArray();
但对于大型阵列,这会慢一些,并没有真正容易在我看来,阅读(特别是如果你以前没有见过吧)。如果我是你,我想我可能会坚持第一种方法。
实际上没有更好的方法来做到这一点。请参阅http://dotnetperls.com/initialize-array
还有一些其他的方法,但简单的循环是significally更快
有没有更好的方式,如果PostType是一个类:你需要访问阵列中的每个位置,并设置它。
如果PostType是一个结构体,那么您根本不需要做任何事情:数组中的每个位置都会自动初始化为结构体的默认值(全部为0)。 (但是如果你想使用非默认的构造函数,那么你会回到类的相同位置 - 你需要访问每个位置并明确地调用非默认构造函数。)
不是我能想到的关闭,当你为它创建数组内存时,除了每个索引都指向null外。最好的办法让你的代码更有效的将qArray.Length
存储到一个变量,所以你不要打电话。长度在循环的每个迭代即
int a = qLength
for(int x = 0; x < qLength; x++)
q[x] = new PostType();
注:可枚举重将无法正常工作,因为它会创建一个实例然后重复对该对象的引用。
一块蛋糕。为什么不做这样的事情。它很简洁。
PostType[] q = qArray.Select(i => new PostType()).ToArray();
我有一个好主意,一个优雅的方式来初始化数组自定义类型。
首先,您必须声明一个静态方法来在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);
,因为它重复在第一个对象的引用,而不是建立新的
可枚举重将无法正常工作(它会产生一个新的对象为每个电话)。但我建议反对重复或范围 - 为了可读性和性能。我已经用一个明确的例子更新了我的评论,并解释了为什么我认为你不应该使用它。 – Aly 2010-01-09 23:45:39
Enumerable.Range作品 – 2010-01-09 23:48:56