【问题标题】:`List` or `array`datastructer to store pick values from array c#?`List`或`array`数据结构来存储从数组c#中挑选的值?
【发布时间】:2025-12-07 16:25:01
【问题描述】:

我正在从double 数组中找到所有选择,那么哪种数据结构应该有效地使用ListArray 来存储结果? 我想通过不按内存运行来提高效率。

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

如果我选择

数组: 我可以先声明result 数组以将pick 元素存储为n 的总大小,然后在找到pick 之后我将resize 它。


列表: 或者我可以使用列表,但我担心的是“列表将在每次列表变满时添加额外的内存”,因此会花费运行时间。

那么我应该使用list 还是array,因为在这里我知道result 的“最大尺寸”是多少?

【问题讨论】:

  • double[] 不是 double()....
  • 不能使用链表吗?这样,您可以为 Add() 和 Remove() 留出固定的时间。当然,它伴随着寻找元素的 O(n) 复杂度成本。
  • @Frenchy 抱歉没有收到您的问题
  • 选择适合您的需求。内存不应该是你首先关心的问题,特别是列表内存开销不应该那么大。如果你想迭代你的集合,选择IEnumerable,如果你需要基于索引的数组或列表。如果要添加/删除项目,请选择列表。
  • 您不必要地担心。 List 不会“每次都添加额外的内存”。 List 翻倍增长。 Count 属性告诉您列表中有多少项目,Capacity 告诉您它可以容纳多少。添加到List 的摊销成本为 O(1)。如果您担心分配时间并且知道列表将容纳多少项目,您可以通过将容量参数传递给构造函数来预先分配列表。

标签: c# arrays list optimization data-structures


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以在创建列表时指定initial capacity。如果你这样做,差异很小。使用你喜欢的任何东西。

    您应该考虑您期望的输入范围。如果您希望存储几兆字节,它可能并不重要。如果它是千兆字节,那么开销和碎片可能变得很重要。如果它是 TB,那么您将需要考虑从二级存储中流式传输数据,或者一次处理单独的数据块。

    【讨论】: