2

如果我执行以下操作:

List<GenericClass> listObj = new List<GenericClass>(100);

// Do I need this part too?
for (int i = 0; i < 100; i++)
{
    listObj[i] = new GenericClass();
}

基本上我在问 C# 编译器是否会为列表中的 100 个 GenericClass 对象中的每一个自动触发 GenericClass 构造函数。我在 MSDN 文档以及 StackOverflow 上进行了搜索。

谢谢你的帮助。

4

4 回答 4

3

这不是如何List工作的。当您指定容量时,它是初始容量,而不是列表中的项目数。该列表不包含任何元素,直到您通过该Add方法添加它们。列表没有最大容量。而且由于您是通过 Add 方法添加对象,是的,您必须先新建它们。

事实上,做你提出的问题会引发ArgumentOutOfRange异常。

对于您正在做的事情,您需要使用一个数组。

var listObj = new List<GenericClass>();
listObj[0] = new GenericClass(); // ArgumentOutOfRange exception

这将起作用:

for (int i=0;i<100;i++)
{
    listObj.Add(new GenericClass());
}

这就是你试图做的:

var arrayObj = new GenericClass[100];
for (int i = 0; i < 100; i++)
{
    arrayObj[i] = new GenericClass();                
}
于 2012-02-05T06:54:30.533 回答
1

是的,您确实需要创建每个实例并将其添加到列表中。查看此构造函数样式的备注部分:http: //msdn.microsoft.com/en-us/library/dw8e0z9z.aspx

您正在指定您希望在列表中放入多少元素,以便每次向列表添加新的 GenericClass 实例时都不必在后台调整大小。

于 2012-02-05T06:55:19.287 回答
0

不!它指定初始容量。

MSDN 文章

List 的容量是 List 可以容纳的元素的数量。随着元素被添加到列表中,容量会根据需要通过重新分配内部数组来自动增加。

于 2012-02-05T06:55:00.067 回答
0

由于您不能直接使用 List 执行此操作,因此您可以使用辅助方法来生成生成器并使用 List(IEnumerable 集合) 重载。

   class Program
    {
        static void Main(string[] args)
        {
            var list = new List<string>
            (
                Generator.New(() => new string('a', 5), 100)
            );

            list.ForEach((x) => Console.WriteLine(x));
        }
    }

    public static class Generator
    {
        public static IEnumerable<T> New<T>(Func<T> generator, int nCount)
        {
            for (int i = 0; i < nCount; i++)
            {
                yield return generator();
            }
        }

        public static IEnumerable<T> New<T>(Func<int,T> generator, int nCount)
        {
            for (int i = 0; i < nCount; i++)
            {
                yield return generator(i);
            }
        }
    }

这确实有效,但如果 List 开箱即用地支持此功能,它就没有那么漂亮了。示例程序将打印由 5 个字符组成的 100 行。

于 2012-02-05T07:27:53.497 回答