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



我问这个问题完全是出于好奇。我没有任何实际的代码需要思考。

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

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

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

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

List<T>的主要优点是可以对其进行扩展和收缩。但是,它可能会占用内存中的大量额外空间,因为它通常会在其后备存储中保留大量额外的空间,这样它就不必在每次扩展时重新分配新的阵列。

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

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

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

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

最新更新