Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 效率:以增量方式创建一个双倍数组?_C# - Fatal编程技术网

C# 效率:以增量方式创建一个双倍数组?

C# 效率:以增量方式创建一个双倍数组?,c#,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 List

考虑以下代码:

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
List l=新列表();
//将未知数量的值添加到列表中
l、 增加(0.1)//假设我们没有提前得到这些值。
l、 增加(0.11);
l、 增加(0.1);
l、 ToArray()//最终,我们需要一系列的替身

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

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

像列表这样的动态数据结构是实现这一点的正确方法。与列表相比,阵列的唯一真正优势是O(1)访问性能(与列表中的O(n)相比)。这种灵活性不仅弥补了性能损失,而且通过一些观察,您可以更好地了解该列表中的所有元素。然后,您可以在构造函数中创建具有初始容量的新列表:

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


我知道这很难实现,但我认为最好分享这样的想法……

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


埃里克·利珀特有一个很好的例子,你可能会觉得很有意义

列表是要访问的O(1)——在内部,它是一个大小动态增长的数组。我知道这个问题很老了,我可能错了,但在我看来OP询问的是
l.ToArray()语句,我也很想知道。如果它必须创建一个全新的数据结构,然后复制所有数据并销毁原始数据,这实际上并不是那么有效。返回
列表
或任何其他不需要复制和转换的数据类型将大大提高效率。
public interface IArrayBuilder<T>
{
    void Add(T item);
    T[] ToArray();
}