`List`or`array`datastructer存储从数组c#拾取的值?

`List`or`array`datastructer存储从数组c#拾取的值?,c#,arrays,list,optimization,data-structures,C#,Arrays,List,Optimization,Data Structures,我正在从doublearray中查找所有pick,那么应该使用哪个数据结构List或array来存储结果? 我希望通过运行而不是内存来提高效率 double[] n = new double[]{2,1,6,5,3,8,1}; # could be n number of elements 如果我愿意 数组: 我可以先声明result数组,将拾取元素存储为n的总大小,然后在找到pick后,我将调整其大小 列表: 或者我可以使用列表,但我担心的是“列表每次满时都会增加额外的内存”,所以这将是

我正在从
double
array中查找所有pick,那么应该使用哪个数据结构
List
array
来存储结果? 我希望通过运行而不是内存来提高效率

double[] n = new double[]{2,1,6,5,3,8,1};  # could be n number of elements
如果我愿意

数组: 我可以先声明
result
数组,将拾取元素存储为
n
的总大小,然后在找到pick后,我将
调整其大小


列表: 或者我可以使用列表,但我担心的是“列表每次满时都会增加额外的内存”,所以这将是运行时的成本

因此,我应该使用
list
还是
array
,因为我知道
结果的“最大大小”是多少?

您可以在创建列表时指定。如果你这样做,差别是最小的。你喜欢什么就用什么

你应该考虑你所期望的输入范围。如果您希望存储几兆字节,这可能没有多大关系。如果是千兆字节,那么开销和碎片可能会变得很重要。如果是百万兆字节,那么你需要考虑从二级存储流数据或一次一个地处理数据块。

< p>你可以指定创建列表的时间。如果你这样做,差别是最小的。你喜欢什么就用什么


你应该考虑你所期望的输入范围。如果您希望存储几兆字节,这可能没有多大关系。如果是千兆字节,那么开销和碎片可能会变得很重要。如果是百万兆字节,那么你需要考虑从二级存储流数据或一次一个地处理数据块。

< P>如果数据动态地增加,你几乎肯定会把列表放在一个数组中。该列表在内部使用一个数组,并在数组已满时自动创建一个新的更大的数组。默认情况下,每次列表已满时,容量都会加倍,但您可以通过设置
list.capacity
自行控制。不过,在大多数情况下,默认的增长策略应该是不错的。

如果数据的大小会动态增加,那么几乎可以肯定的是,您更喜欢列表而不是数组。该列表在内部使用一个数组,并在数组已满时自动创建一个新的更大的数组。默认情况下,每次列表已满时,容量都会加倍,但您可以通过设置
list.capacity
自行控制。不过,在大多数情况下,默认的增长策略应该可以。

double[]not double()……难道不能使用链表吗?这样,您就可以为Add()和Remove()设置恒定的时间。当然,找到一个元素要付出O(n)复杂度的代价。@Frenchy抱歉没有得到你的问题,选择了适合你需要的。内存不应该是您首先关心的问题,尤其是列表内存开销不应该那么大。如果要迭代集合,如果需要基于索引的take数组或列表,请选择
IEnumerable
。如果您想添加/删除项目,请选择“列表”。这样您就不必担心了<代码>列表
不会“每次添加额外内存”。
列表
会加倍增长。
Count
属性告诉您列表中有多少项,
Capacity
告诉您它可以容纳多少项。添加到
列表中的摊余成本为O(1)。如果您担心分配时间,并且知道列表将包含多少项,则可以通过将容量参数传递给构造函数来预先分配列表。double[]not double()…您不能使用链表吗?这样,您就可以为Add()和Remove()设置恒定的时间。当然,找到一个元素要付出O(n)复杂度的代价。@Frenchy抱歉没有得到你的问题,选择了适合你需要的。内存不应该是您首先关心的问题,尤其是列表内存开销不应该那么大。如果要迭代集合,如果需要基于索引的take数组或列表,请选择
IEnumerable
。如果您想添加/删除项目,请选择“列表”。这样您就不必担心了<代码>列表
不会“每次添加额外内存”。
列表
会加倍增长。
Count
属性告诉您列表中有多少项,
Capacity
告诉您它可以容纳多少项。添加到
列表中的摊余成本为O(1)。如果您担心分配时间,并且知道列表将包含多少项,那么可以通过将容量参数传递给构造函数来预分配列表。