T []和List <t>之间有什么区别?</t>

时间:2011-03-04 01:05:52

标签: c# arrays generics c#-2.0

实际上我总是使用Generic Collections,而且我经常使用List&lt;&gt;。 有些场景我认为new List<string>()非常难看,我更喜欢使用string[],但我不使用它,因为据我所知,泛型具有更好的性能,因此我使用它们。

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

我只是想知道阵列和通用集合之间的真正区别是什么。

修改

让我们伪造一个场景

如果我使用string[]List<string>,我必须调用此方法吗?什么更好?

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

5 个答案:

答案 0 :(得分:6)

主要区别在于您可以向List<T>添加新元素。

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

使用List<T>的主要原因是它为您提供了更多功能 - 您可以添加和删除元素。

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

在大多数真实场景中,您将从某个地方读取数据 - 如果您可以一次获取所有数据,那么您可以使用数组。如果您将逐个阅读它们,那么您将使用List<string>,以便在阅读时添加元素。

答案 1 :(得分:3)

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

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

如果你正在使用LINQ,你将更有可能使用IEnumerable<T>并且不关心实际实现该接口的类型。

答案 2 :(得分:2)

List<T>基本上是数组T[]的包装器,带有其他方法和IList<T>的隐式实现。

此外,typeof(T[]).IsAssignableFrom(typeof(IList<T>)) == true

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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