如何使用自定义类型初始化数组

时间:2010-01-09 23:31:09

标签: c# arrays

如何初始化此自定义类型数组:

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

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

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

6 个答案:

答案 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不起作用,因为它创建了一个对象实例,然后重复对该对象的引用。