代码之家  ›  专栏  ›  技术社区  ›  Alan

效率:增量创建一个double数组?

c#
  •  5
  • Alan  · 技术社区  · 16 年前

    请考虑以下代码:

    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 回复  |  直到 16 年前
        1
  •  8
  •   Darin Dimitrov    16 年前

    你的方法没问题。您正为此目的使用正确的数据类型。

        2
  •  3
  •   Ron Klein Noa Kuperberg    16 年前

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

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

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


    更新 :

    如果你:

    • 只需要 Add 和 ToArray 的功能 List<T> 结构,
    • 你无法预测总容量
    • 最后你得到了超过1k个元素
    • 更好的表现真的(真的!)你的目标

    然后您可能需要编写自己的接口:

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

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

    我知道这是一个漫长的过程,但我认为最好是分享这样的想法…

        3
  •  0
  •   Brian Rasmussen    16 年前

    正如其他人已经指出的那样:这是正确的做法。如果你能避免使用数组 List<T> 直接或可能 IEnumerable<T> ,将避免将数组复制为 ToArray 实际上复制列表实例的内部数组。

    埃里克利珀特有一个伟大的 post about arrays ,你可能会发现相关的。

        4
  •  -1
  •   Bartek Tatkowski    16 年前

    像列表这样的动态数据结构是实现这一点的正确方法。与列表相比,数组唯一真正的优势是o(1)访问性能(与列表中的o(n)相比)。灵活性不仅弥补了性能上的损失