高效创建包含大量项目的List <myobject> </myobject>

时间:2011-12-15 06:50:30

标签: c# optimization c#-2.0

在我的代码中,我有时需要创建大量对象。请注意,我需要集合而不是数组,因为我可能需要稍后添加项目。

有效的方法是什么?

让我们假设对象非常简单,可以使用默认的无参数构造函数快速创建。像这样:

class MyObject
{
    private int a;

    public int A
    {
        get { return a; }
        set { a = value; }
    }
}

当然,我可以像这样创建我的收藏:

List<MyObject> list = new List<MyObject>(knownNumberOfItems);
for (int i = 0; i < knownNumberOfItems; i++)
    list.Add(new MyObject());

但也许有更好的方法可以做同样的事情?

讨论摘要:

  • 没有更快的方法为引用类型执行此操作。您可以使用值类型获得一些性能改进。
  • 最初尝试分配更多空间,以减少以后添加新项目时的重新分配次数。

5 个答案:

答案 0 :(得分:2)

没有比我更熟悉的更快的方法了。我个人在for循环的主体周围使用大括号,但作为一种创建给定大小的列表的方法,填充了对新对象的不同引用,这就是它。重要的是你指定了列表的大小,因此那些Add调用不需要在内部重新分配任何内容。

如果您以后可能会添加项目,可能想要提供更大的尺寸。

这不太可能是你系统中的瓶颈 - 而且一如既往,可读性应该是你最关心的问题(除了我建议的改变之外,这不是问题),性能不断被测量,但是只有在通过测量验证问题时才会导致低水平的变化。

答案 1 :(得分:1)

不在.Net 2.0中。从.Net 3.5开始,你可以稍微写一下,但编译结果基本相同。

答案 2 :(得分:1)

你的方式非常高效 - 创建一个数组,为你的所有项目创建足够的空间,list.Add非常快。

您是否遇到性能问题?

答案 3 :(得分:1)

我可以考虑一下

LinkedList<T> list = ...

向链表添加操作是固定时间。

答案 4 :(得分:1)

考虑使您的类型成为值类型(struct),这样您就不需要为实例分配内存,并且列表不会分割内存。之后创建如下列表:

var List = new MyList<MyObject>(Enumerable<MyObject>.Repeat(new MyObject(),
                                known_number_of_items));

documentation开始,保证在O(n)运行。但这不适用于引用类型(class),因为它会一遍又一遍地插入相同的对象。