【问题标题】:What's the difference Between T[] and List<T>?T[] 和 List<T> 有什么区别?
【发布时间】:2011-03-04 01:05:51
【问题描述】:

实际上我一直在使用泛型集合并且我经常使用列表。 有些场景我觉得new List&lt;string&gt;()很丑,我更喜欢用string[],但是我不使用它,因为据我所知泛型性能更好,所以我使用它们。

string[]、int[] 或任何非泛型数组对应用程序有害吗?

我只是想知道数组和泛型集合之间的真正区别和影响。

编辑:

让我们假装一个场景

我必须调用这个方法,我应该使用string[]还是List&lt;string&gt;?什么更好?

static void PrintValues(IEnumerable<string> values) {
    foreach(var value in values) {
        Console.WriteLine(value);
    }
}

【问题讨论】:

  • 为什么这么丑?我有相反的意见。
  • @Ritch,如果您认为 List 非常简洁,那没关系。我的观点正好相反。
  • 回复你的帖子,作为一个列表:values.ForEach(console.WriteLine)。作为一个数组,它的 Array.ForEach(values, console.WriteLine);
  • 对不起,没有。我的问题不在于 ForEach。如您所见,我的方法接收没有 ForEach 方法的 IEnumerable,只有 List 和 Array 有。

标签: c# arrays generics c#-2.0


【解决方案1】:

主要区别在于您可以向List&lt;T&gt; 添加新元素。

List&lt;T&gt; 在内部将元素存储在 T[] 类型的数组中,它只是在您添加新元素时自动分配一个更大的数组(或在您删除元素时缩小数组)。这意味着性能将大致相似。使用 List&lt;T&gt; 时有一些次要的间接性,但 JITter 可能会内联。

使用List&lt;T&gt; 的主要原因是它为您提供了更多功能——您可以添加和删除元素。

编辑在您使用PrintValues 的示例中,这并不重要。这取决于数据的来源。如果您只想使用一些固定参数调用它,您可以使用数组,因为它们更容易创建,例如new [] { "hello", "world" }.

在大多数实际场景中,您将从某个地方读取数据 - 如果您可以一次获取所有数据,那么您可以使用数组。如果您要一个接一个地阅读它们,那么您将使用List&lt;string&gt;,这样您就可以在阅读它们时添加元素。

【讨论】:

    【解决方案2】:

    要回答您编辑的问题,答案是:PrintValues 函数无关紧要。它会简单地迭代。

    重要的是调用此函数的代码 - 它是如何得出要打印的值的?如果它们是一个相当静态的值列表,那么使用数组会更有效。如果需要构建或以其他方式操作集合,那么List&lt;T&gt;(或Stack&lt;T&gt; 或其他)可能会更好。

    如果您使用的是 LINQ,您将更有可能使用 IEnumerable&lt;T&gt;,而不关心实际实现该接口的类型。

    【讨论】:

      【解决方案3】:

      List&lt;T&gt; 基本上是数组T[] 的包装器,带有附加方法和IList&lt;T&gt; 的隐式实现。

      另外,typeof(T[]).IsAssignableFrom(typeof(IList&lt;T&gt;)) == true

      在我看来,数组的性能会比列表的性能更好,因为列表所做的一切,它都对数组做一些事情,而数组只是对自己做一些事情。

      【讨论】:

        【解决方案4】:

        我总是考虑在这两者之间进行选择,我也会给你添加一个新的。

        • 数组:我只将它用于只读访问,因为随机访问是直接的。
        • ArrayList:使用内部按需增长的数组,因此它具有易于随机访问的优点,但如果数组在插入时已满,则必须分配一个新数组并复制所有元素。
        • LinkedList:非常适合插入,如果您想要随机访问,则应避免使用,因为它必须遍历所有元素,直到请求的元素。

        【讨论】:

          【解决方案5】:

          数组是一种原始语言结构。这意味着,理论上,它们更有效。另一方面,它们的功能更少,允许不需要的操作,没有接口,具有有趣属性的多个实现......

          除非您有非常严重的性能问题,否则请使用集合,而不是数组。

          【讨论】:

          • 没有接口?在 .Net 4.0 中,Array 实现 ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable!
          • 同意@Gabe。 CLR 中的数组不是原始构造,而且从来都不是。必须衡量效率,我相信根据使用情况,一个会胜过另一个。
          • 数组确实是高效的——这是大多数其他数据结构(列表、字典、集合)在幕后使用的。不过,这并不意味着建立在它们之上的数据结构不是高效。
          猜你喜欢
          • 1970-01-01
          • 2010-09-28
          • 2012-03-10
          • 1970-01-01
          • 2021-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-01
          相关资源
          最近更新 更多