哪个更好使用数组或List<>?

时间:2010-06-04 15:13:10

标签: c# .net performance collections

我想知道哪种类型会有更好的性能以及您认为应该使用哪种类型。

例如,我有一个字符串列表,不知道我需要多少项,因此.Add(String)函数非常方便。我可以随时轻松地将新字符串添加到列表中。

使用每种产品有哪些优点/缺点?

列出新阵列吗?

8 个答案:

答案 0 :(得分:36)

确实需要更多背景来正确回答这个问题:

公共API 中,您应该尝试使用抽象集合类型,以便以后可以根据需要更改内部实现。

  • 如果外部世界不应更改该集合,请使用IEnumerable<T>
  • 如果外部世界更改 集合,请使用ICollection<T>
  • 如果需要建立索引,请使用IList<T>

私有实现中,使用抽象类型并不重要:

  • 如果您需要建立索引并知道最终尺寸,请使用T[]List<T>
  • 如果您需要索引访问且不知道最终大小,请使用List<T>
  • 如果您打算以LIFO模式访问元素,请使用Stack<T>
  • 如果您打算以FIFO模式访问元素,请使用Queue<T>
  • 如果您需要访问列表开头和结尾的元素,而不是中间的元素,请使用LinkedList<T>
  • 如果您不想要重复,请使用HashSet<T>

在.NET 4.0中,您还有其他一些选择,但这些是基础知识。

答案 1 :(得分:22)

List<String>是使用数组String[]实现的。

如果您不知道自己有多少元素,请使用List<String>

您可以在容量构造函数参数(new List<String>(10))中提供所需的估计(或最大)元素数,这将是基础数组的初始大小。

当你Add()一个项目并且该项目没有空间时,底层数组将被复制到一个大小翻倍的新数组。

我的所作所为:当我知道集合的确切大小并且我知道我不会更改集合的大小时,我使用数组(String[])。否则我使用List<String>

顺便说一句,这适用于任何类型,而不仅仅是String

答案 2 :(得分:7)

这取决于使用情况,但它也是一个微优化,直到您通过分析确定了瓶颈。使用最适合用途的任何东西。

答案 3 :(得分:3)

使用列表&lt;&gt;在大多数情况下,并不担心性能。很有可能你将完成整个职业生涯,并且永远不需要通过转换List&lt;&gt;来进行表现调整。成阵列。

答案 4 :(得分:3)

在大多数情况下,性能差异并不明显,因此我会使用List<string>,因为它提供了更多在不同情况下有用的功能。

答案 5 :(得分:2)

如果您不知道要添加的项目的大小,请始终使用List<string>而不是字符串数组。

答案 6 :(得分:2)

如果您需要动态调整大小,请使用List<string>

如果你担心表现,那么我建议从List<string>开始,看看是否真的存在问题。它在内部使用数组,所以我认为,在大多数情况下,应该没有性能问题。

如果您有一个静态大小的集合,您仍然可以使用string[]

答案 7 :(得分:2)

当然,这取决于您的申请,但在List<string>(或者甚至只是IEnumerable<string>的情况下更可取。