正如杰夫说,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;
}
}
或者这个的基础上,杰夫的第2个解决方案:
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();
我没有完全资料这个,但我希望这WIL我比基于LINQ/IEnumerable的内置选项获得更好的性能。看起来,杰夫的第二个解决方案总是禁食。
[本] [1]似乎是同样的问题,回答。 [1]:http://stackoverflow.com/questions/2569279/how-to-flatten-2d-array-to-1d-array – Oleksi
@Olexsi它不是完全一样;这个问题使用了一个适当的二维数组,而你链接的是询问一个二维锯齿状数组。 – phoog