我纯粹出于好奇而问这个问题。我没有任何实际的代码可以思考。
是否存在使用锯齿状数组而不是列表列表的最佳情况,反之亦然?
aList<T>
是一个数组,只是 a 包装在一个类中,因此它可以随意重新分配和调整大小。因此,否则两者之间的性能可以认为是相同的 - 仅List<List<T>>
在需要调整任一维度的大小时使用 - 不要忘记,无论何时调整第 0 维度的大小,都需要在第 1 维度中构建新实例,这可能会很昂贵。
您忘记了 n 维数组(即T[,]
)。然而,由于 .NET 边界检查的一个怪癖,这些实际上比锯齿状数组或一维用户管理的数组要慢,这完全是个谜。
锯齿状数组和列表列表与普通列表和数组具有相同的相对优点:
a 的主要优点List<T>
是你可以扩大和缩小它。然而,它可能会在内存中占用大量额外空间,因为它通常会在其后备存储中保留一堆额外空间,这样它就不必在每次增长时重新分配一个新数组。
数组的主要优点是它很紧凑——它有足够的空间来存储其中的元素数量,仅此而已。但它的大小是静态的;如果您需要向其中添加新项目,则必须替换现有项目或手动创建更大的数组并将数据复制到其中。
就速度而言,在任何实际范围内,它们的行为都应该相同。 List<T>
使用数组作为其后备存储,因此由于额外的间接层,它可能比等效数组稍慢。但我不会假设如果没有仔细测量 - 它是否以及在多大程度上会随着框架或 CLR 的不同版本而改变。
我会说 aList<T>
更灵活,而 asT[]
更具互操作性。例如,如果我想构建一个未知大小的列表,我会使用List<T>
. 如果我从 Web 服务返回列表,我会使用T[]
.
我知道我在这里指的是单维列表,但同样的做法也适用于多维。