在C#中,有没有一种方法可以直接从数组创建列表而不进行复制?

时间:2018-09-25 18:54:42

标签: c# arrays list

C#是否提供一种直接从数组创建列表而不用一一复制元素的方法?

我知道一个列表在后台简单地维护着一个数组,因此从一个数组开始并创建一个新列表只是在内部指向该数组似乎是很自然的。当将数组转换为List时,这样做的好处是可以极大地提高性能。

在C#中是否有本地方法可以做到这一点?如果没有,是否有人有扩展方法或库来做到这一点?

Peter要求对“性能的巨大提高”进行量化。因此,这是基于我对List构造函数的工作原理的理解:

List()包含三个重载。重载之一将IEnumerable作为输入。此重载的工作方式是声明一个很小的新列表(除非它在最新的c#版本中已更改,历史默认大小为0,然后在首次添加元素时初始化为4)。

每次将元素添加到列表中时,如果新元素超出了容量,则通过创建全新的数组并将元素一一复制到新数组中来使数组大小加倍。结果是,从IEnumerable构建列表的成本为O(n)加上发生的所有阵列副本的成本。要点是,它并不小。

对于IEnumerable,List()构造必须以这种方式工作,因为IEnumerable的大小未知。如果要从数组中创建列表,则在创建时会知道确切的大小,这意味着成本应为O(1)。

2 个答案:

答案 0 :(得分:5)

否,因为List对象需要能够依靠对数组的控制。如果您对列表外部的数组有引用,则它将失去该保证。

答案 1 :(得分:1)

  1. 您可能不需要额外的性能,并且如果您的应用遇到性能问题,从数组到列表的转换可能不是罪魁祸首。
  2. 如果是 的罪魁祸首,并且如果您需要需要这种性能,则应首先尝试重构代码,以使您不必经常从数组转换为列表。
  3. 非常不太可能是您确实需要的情况下,如果您确实有野心,则可以自己制作IList<T>并添加您的数组。

所以你会得到类似的东西

public class CustomList<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
{
    public CustomList (T[] array)
    {
        //insert implementation here
    }
    // insert implimentation here
}

注意:通过执行此操作而获得的假定的性能提升可能不值得花时间来实现此类,更不用说在实现新List时会出错的风险。如果您必须在Stack Overflow上问类似这样的问题,您可能没有足够的经验来做出比Microsoft更好的IList<T>