创建一个列表,然后将其转换为数组

时间:2015-04-01 08:44:41

标签: c# arrays

阵列非常快,但另一方面你无法向阵列添加任何内容列表非常方便你可以添加新项而不用担心但是它们要慢得多 我首先使用Lists添加我的Items,然后通过MyList.ToArray()将其转换为Array,然后我处理数组中的数据。现在我想知道这真的是有效的速度吗?或者我只是通过转换为数组来浪费更多时间?

5 个答案:

答案 0 :(得分:5)

MSDN说ToArray是O(N),其中N是计数:https://msdn.microsoft.com/en-us/library/x303t819%28v=vs.110%29.aspx

  

使用Array.Copy复制元素,这是一个O(n)操作,其中n是Count。

     

此方法是O(n)操作,其中n是Count。

因此,您基本上要处理列表两次:一次用于ToArray调用,再次在下一个循环中实际处理列表。在大多数情况下,删除ToArray可能比执行转换更有效。

答案 1 :(得分:3)

通过索引访问数组元素比通过索引访问列表元素更快。原因可以在.NET Framework的源代码中找到。每次访问列表元素都会产生明确的范围检查。即使在最明显的情况下(从0list.Count循环的循环),当前的JIT也无法优化它。

将列表转换为数组具有一次性O(N)成本。这笔费用并非微不足道。您必须经常访问该阵列才能分摊成本。

我无法告诉你引爆点在哪里。这必须要衡量。作为一个主观猜测,我会说在整个集合中迭代10-100次会使这个值得。

TL; DR:如果您经常使用阵列,那么这将获得回报。通常,这种技术要么有害,要么浪费开发时间。

答案 2 :(得分:1)

因为调整数组的大小是时间昂贵的,所以当我必须选择list vs array时,我问自己唯一的判别问题是:集合的大小是否固定?

  • 是:使用数组
  • 否:使用清单

现在说你使用一个列表。在使用它之前将它转换为数组是没有必要的,因为Jun说。

除非您花费大量时间来处理数据(并且转换已按照usr所说的那样充分摊销),否则转换应仅在必要时进行(需要数组的第三方API调用)。< / p>

答案 3 :(得分:0)

如果很少使用您的数组/列表,那么微优化并不重要,您不应该花时间优化那些不会产生任何影响的事情。相反,通过使用(通用)列表可以使代码易于维护,易于阅读且不易出错。使用列表还允许您使用LINQ查询它们,再次获胜。

答案 4 :(得分:-3)

使用区域有点不同。

最好在不大的数据中使用数组。如果使用列表,大小更大,如100或更高。

是的,根据尺寸存在速度差异。大数据中的列表更好。