效率:逐步创建一系列双打?

时间:2010-03-30 08:13:05

标签: c#

请考虑以下代码:

List<double> l = new List<double>();

//add unknown number of values to the list
l.Add(0.1); //assume we don't have these values ahead of time.
l.Add(0.11);
l.Add(0.1);

l.ToArray(); //ultimately we want an array of doubles

这种做法有什么问题吗?有没有更合适的方法来构建数组,而不知道大小或元素提前?

4 个答案:

答案 0 :(得分:8)

你的方法没有错。您正在使用正确的数据类型。

答案 1 :(得分:3)

经过一些观察后,您可以更好地了解该列表中的总元素。然后,您可以在构造函数中创建具有初始容量的新列表:

List<double> l = new List<double>(capacity);

除此之外,它是正确的技术和数据结构。


<强>更新

如果你:

  • 只需要Add结构的ToArrayList<T>个功能,
  • 你无法真正预测总容量
  • 你最终获得了超过1K的元素
  • 更好的表现真的(真的!)你的目标

然后你可能想要编写自己的界面:

public interface IArrayBuilder<T>
{
    void Add(T item);
    T[] ToArray();
}

然后编写自己的实现,这可能比List<T>更好。这是为什么?因为List<T>在内部拥有一个数组,并且在需要时会增加其大小。在性能方面增加内部数组成本的过程,因为它分配了新内存(并且可能将旧数组中的元素复制到新数组中,我不记得了)。但是,如果上述所有条件都成立,那么您只需构建一个数组,就不需要在内部将所有数据存储在单个数组中。

我知道这是一个很长的镜头,但我认为分享这些想法会更好......

答案 2 :(得分:0)

正如其他人已经指出的那样:这是正确的做法。我只想补充说,如果你能以某种方式避免数组并直接使用List<T>或者IEnumerable<T>,你将避免复制数组,因为ToArray实际上复制了列表的内部数组实例。

Eric Lippert有一个很棒的post about arrays,你可能会觉得相关。

答案 3 :(得分:-1)

像List这样的动态数据结构是实现它的正确方法。数组在List上唯一真正的优势是O(1)访问性能(与List中的O(n)相比)。灵活性足以弥补这种性能损失imho