在我的代码中,我有时需要创建大量对象。请注意,我需要集合而不是数组,因为我可能需要稍后添加项目。
有效的方法是什么?
让我们假设对象非常简单,可以使用默认的无参数构造函数快速创建。像这样:
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());
但也许有更好的方法可以做同样的事情?
讨论摘要:
答案 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
),因为它会一遍又一遍地插入相同的对象。