【问题标题】:c# array vs generic list [duplicate]c#数组与泛型列表[重复]
【发布时间】:2010-03-12 06:18:28
【问题描述】:

我基本上想知道在下面提到的场景中使用泛型列表而不是数组的区别或优势

class Employee
{
    private string _empName;

    public string EmpName
    {
       get{ return _empName; }
       set{ _empName = value; }
    }
}

1. Employee[] emp 
2. List<Employee> emp

谁能告诉我优点或缺点以及更喜欢哪一个?

【问题讨论】:

  • 如果你使用自动实现的属性,你的类会更干净: public string EmployeeName {get;放;}。使用像 EmployeeName 这样的全名也会有所帮助。哦,还有一些类型呢? :-)

标签: c# arrays generic-list


【解决方案1】:

一个很大的区别是List&lt;Employee&gt; 可以扩展(您可以对其调用 Add)或收缩(您可以对其调用 Remove),而 Employee[] 的大小是固定的。因此,除非需要,否则Employee[] 更难使用。

【讨论】:

  • 加上 LINQ 库,如果您在某个时候需要它在某个数组中的某个位置,您始终可以调用 List.ToArray(),因此 List 确实为您提供了最佳的功能和灵活性。跨度>
  • ToArray() 是早于 LINQ 的 List 对象的内置方法。 LINQ 为 IEnumerables 添加了类似的方法。
【解决方案2】:

最大的区别是数组一旦创建就不能变长或变短。但是,列表实例可以添加或删除元素。还有其他差异(例如,可用的不同方法集),但添加/删除是最大的差异。

我喜欢 List,除非有充分的理由使用 Array,因为 List 的灵活性很好,而且相对于代码通常执行的大多数其他事情的成本而言,性能损失非常小。

如果您想深入了解很多有趣的技术细节,请查看this StackOverflow thread,它更深入地研究了列表与数组的问题。

【讨论】:

  • 这并不意味着它们是不可变的;您仍然可以交换内容。它只是使它们固定大小。
  • 呃,好点马克。误用了不可变一词。现在变了。顺便说一句,我看到你之前已经回答过这个问题......我在上面的答案中添加了一个链接。 :-)
  • +1 链接到另一个线程
【解决方案3】:

使用通用列表,您可以廉价地使用Add / Remove 等(至少在远端)。调整数组的大小(添加/删除)更昂贵。明显的缺点是列表有备用容量,因此可能会浪费一些字节 - 但在大多数情况下不值得担心(您可以修剪它)。

通常,除非您知道您的数据永远不会改变大小,否则更喜欢列表。

在 API 方面,由于 LINQ,它们之间几乎没有选择余地(即 List&lt;T&gt; 上的额外方法在很大程度上被 LINQ 复制,因此数组可以免费获得它们)。

另一个优点是使用列表您不需要公开 setter:

private readonly List<Foo> items = new List<Foo>();
public List<Foo> Items { get { return items; } }

消除了一系列null 错误,并允许您保持对数据的控制(特别是如果您使用不同的IList&lt;&gt; 实现,在更改内容时支持检查/验证)。

【讨论】:

    【解决方案4】:

    如果您在公共接口中公开集合,.NET Framework 指南建议使用 List 而不是 T[]。 (其实就是一个BindingList)

    在内部,如果您有一个固定的、已知大小的集合,则数组可能更合适。与将元素添加到 List 末尾相比,调整数组大小的成本更高。

    【讨论】:

      【解决方案5】:

      您需要在创建数组时知道其大小,但创建后无法更改其大小。

      因此,它在创建时为数组使用动态内存分配。 (这与用于 C++ 数组的静态内存分配不同,后者的大小必须在编译时知道。)

      列表可以在创建后动态增长,并且它具有执行此操作的 .Add() 函数。

      -from MSDN

      1. Generics Vs Array Lists-SO 一般比较。
      2. Generic List vs Arrays-SO 为什么泛型列表比数组慢?

      更喜欢哪一个? List&lt;T&gt;.

      【讨论】:

        【解决方案6】:

        如果你知道数组元素的数量是一个不错的选择。如果不使用列表。在内部 List&lt;T&gt; 使用 T 数组,因此实际上比您想象的更像。

        【讨论】:

          【解决方案7】:

          使用列表,您无需事先知道数组的大小。您可以根据实施需要动态添加新员工。

          【讨论】:

            猜你喜欢
            • 2010-09-10
            • 1970-01-01
            • 2010-09-26
            • 1970-01-01
            • 1970-01-01
            • 2016-06-13
            • 1970-01-01
            • 2011-12-24
            • 1970-01-01
            相关资源
            最近更新 更多