正如傑夫說,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