C# 在C语言中,有没有一种方法可以直接从数组中创建一个列表而无需复制?

C# 在C语言中,有没有一种方法可以直接从数组中创建一个列表而无需复制?,c#,arrays,list,C#,Arrays,List,C是否提供了一种直接从数组创建列表而不逐个复制元素的方法 我知道在引擎盖下,列表只是维护一个数组,因此从数组开始创建一个新列表并在内部指向数组似乎是很自然的。这样做的好处是,在将数组转换为列表时,性能将得到极大提高 在c语言中有没有一种原生的方法来实现这一点?如果没有,是否有人有扩展方法或库来执行此操作 彼得要求量化业绩上的巨大进步。这是基于我对列表构造函数工作原理的理解: 列表包含三个重载。其中一个重载将IEnumerable作为输入。这个重载通过声明一个非常小的新列表来工作,除非它在最近的c

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

我知道在引擎盖下,列表只是维护一个数组,因此从数组开始创建一个新列表并在内部指向数组似乎是很自然的。这样做的好处是,在将数组转换为列表时,性能将得到极大提高

在c语言中有没有一种原生的方法来实现这一点?如果没有,是否有人有扩展方法或库来执行此操作

彼得要求量化业绩上的巨大进步。这是基于我对列表构造函数工作原理的理解:

列表包含三个重载。其中一个重载将IEnumerable作为输入。这个重载通过声明一个非常小的新列表来工作,除非它在最近的c版本中发生了更改,历史默认大小为0,然后在首次添加元素时初始化为4

每次将元素添加到列表中时,如果新元素超出容量,则通过创建一个全新的数组并将元素逐个复制到新数组中,数组大小将加倍。这样做的结果是,从IEnumerable构建列表的成本加上发生的所有数组副本的成本。重点是,它不小


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

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

您可能不需要额外的性能,如果您的应用程序遇到性能问题,从阵列转换为列表可能不是罪魁祸首。 如果它是罪魁祸首,并且您确实需要性能,那么您应该首先尝试重构代码,这样您就不需要经常从数组转换到列表。 在非常不可能的情况下,您确实需要它,并且如果您真的有雄心壮志,您可能能够制作自己的IList并将您的阵列添加到其中。 所以你想要的是

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
}

注意:这样做所获得的性能增益可能不值得花时间来实现这个类,更不用说在实现新列表时会犯一些错误的风险了。如果您必须就堆栈溢出问题提出这样的问题,您可能没有足够的经验来制作比Microsoft更好的IList

请量化绩效方面的巨大收益。在大多数情况下,这似乎是过早的优化。接受数组的列表构造函数将调用array.Copy。我怀疑这将blit整个数组,而不是逐个枚举和复制;newList.addRangeTheray;但是速度要快一些,谁知道呢,这可能就是System.Array.ToList在封面下所做的。我对这个问题有点困惑——列表构造函数是否逐个复制项是一个实现细节。当给定一个数组作为参数时,列表构造函数将从旧数组调用CopyTo到新数组,它也应该这样做。CopyTo的工作原理——无论它是一次复制一个项目,还是将它们分批处理以利用处理器同时复制多个小项目的能力——同样是一个实现细节。但是代码应该非常快,我不认为这是一个愚蠢的问题;我确实认为阵列几乎从来都不是满足我需求的数据结构,原因正是您所引用的!数组是大小固定但内容可变的奇怪组合,这是我不想要的。十年前我写了一篇关于这个主题的博客文章。我现在觉得很可笑。哈哈,谢谢你,乔