正如Jeff所说,LINQ使这变得微不足道。
OfType<>()
通常比
Cast<>
快一点:
array1D = array2D.OfType<int>().ToArray();
OfType<>
的实现仍然会受到装箱/拆箱的惩罚,正如 @phoog 所提到的。
只是为了好玩,如果你想要一个快速的基于 LINQ 的解决方案(避免装箱的成本),你可以使用这个小的扩展方法:
static class LinqEx
{
public static IEnumerable<T> Flatten<T>(this T[,] matrix)
{
foreach (var item in matrix) yield return item;
}
}
或者基于Jeff的第二个解决方案:
public static IEnumerable<T> Flatten<T>(this T[,] matrix)
{
var rows = matrix.GetLength(0);
var cols = matrix.GetLength(1);
for (var i = 0; i < rows;i++ )
{
for (var j = 0; j < cols; j++ )
yield return matrix[i, j];
}
}
用法:
int[,] array2D = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int[] array1D = array2D.Flatten().ToArray();
我没有完全对此进行分析,但我预计这将比基于LINQ/IEnumerable的内置选项提供更好的性能。不过,在Jeff的第二个解决方案中似乎始终是最快的。