2010-01-09 64 views
9

如何初始化数组自定义类型的:如何初始化与自定义类型阵列

PostType[] q = new PostType[qArray.Length]; 

//initialize array 
for(int x = 0; x < qArray.Length; x++) 
    q[x] = new PostType(); 

是否有更好的方法来初始化这个数组?

回答

5

你正在做它的方式是好的:

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

但对于大型阵列,这会慢一些,并没有真正容易在我看来,阅读(特别是如果你以前没有见过吧)。如果我是你,我想我可能会坚持第一种方法。

+0

可枚举重将无法正常工作(它会产生一个新的对象为每个电话)。但我建议反对重复或范围 - 为了可读性和性能。我已经用一个明确的例子更新了我的评论,并解释了为什么我认为你不应该使用它。 – Aly 2010-01-09 23:45:39

+0

Enumerable.Range作品 – 2010-01-09 23:48:56

2

有没有更好的方式,如果PostType是一个类:你需要访问阵列中的每个位置,并设置它。

如果PostType是一个结构体,那么您根本不需要做任何事情:数组中的每个位置都会自动初始化为结构体的默认值(全部为0)。 (但是如果你想使用非默认的构造函数,那么你会回到类的相同位置 - 你需要访问每个位置并明确地调用非默认构造函数。)

0

不是我能想到的关闭,当你为它创建数组内存时,除了每个索引都指向null外。最好的办法让你的代码更有效的将qArray.Length存储到一个变量,所以你不要打电话。长度在循环的每个迭代即

int a = qLength 
    for(int x = 0; x < qLength; x++) 
     q[x] = new PostType(); 

注:可枚举重将无法正常工作,因为它会创建一个实例然后重复对该对象的引用。

2

一块蛋糕。为什么不做这样的事情。它很简洁。

PostType[] q = qArray.Select(i => new PostType()).ToArray(); 
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); 
,因为它重复在第一个对象的引用,而不是建立新的