在C#中哪个更好/更快?列表列表或数组数组(锯齿状数组)?

时间:2012-09-25 21:56:51

标签: c# arrays list

我出于纯粹的好奇心问这个问题。我没有任何实际的代码可以思考。

是否存在使用锯齿状数组而非列表列表的最佳情况,反之亦然?

3 个答案:

答案 0 :(得分:3)

List<T> 一个数组,只是包装在一个类中,因此它可以随意重新分配和调整大小。所以否则两者之间的性能可以被认为是相同的 - 如果你需要调整任何一个维度,只使用List<List<T>> - 不要忘记每当你调整第0维度时,你需要在第一维中构造新实例,这可能很贵。

你忘了n维数组(即T[,])。但是,由于.NET边界检查中的怪癖,这些实际上比锯齿状数组或单维用户管理数组慢,这是一个完全的谜。

答案 1 :(得分:1)

锯齿状数组和列表列表与普通列表和数组具有相同的相对优点:

List<T>的主要优点是可以增长和缩小它。但是它可能会占用内存中的大量额外空间,因为它通常会在其后备存储中保留一大堆额外空间,因此每次增长时都不需要重新分配新数组。

数组的主要优点是它很紧凑 - 它有足够的空间来存储其中的元素数量,而不是更多。但它的大小是静态的;如果您需要向其添加新项目,则必须替换现有项目或手动创建更大的数组并将数据复制到其中。

就速度而言,它们应该在任何实际程度上表现相同。 List<T>使用数组作为其后备存储,因此可能比等效数组略慢,因为额外的间接层。但我不认为没有仔细测量 - 它是否以及在多大程度上可以改变不同版本的框架或CLR。

答案 2 :(得分:1)

我会说List<T>更灵活,因为T[]更具互操作性。例如,如果我想构建一个未知大小的列表,我会使用List<T>。如果我从网络服务返回列表,我会使用T[]

我知道我在这里指的是单维列表,但同样的做法适用于多个维度。