Как сказал Джефф, 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;
}
}
Или это, основываясь на втором решении Джеффа:
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. Второе решение Джеффа, однако, всегда будет натощак.