Reputation: 119
I would like to copy a specific row from a multidimensional array to a new one dimensional array that can be used somewhere else in my code.
Input:
Multidimensional array[3,3]:
33 300 500,
56 354 516,
65 654 489,
Required output:
Single Dimension Array (second line)
56 354 516
Upvotes: 5
Views: 4317
Reputation: 1956
In .NET Core 2.1 and later, you can use MemoryMarshal.CreateSpan<T>(T, Int32)
method to create a linear Span from a multidimensional array, then use Span<T>.CopyTo(Span<T>)
method to copy the required data into or from the multidimensional array.
int[,] table =
{
{ 33, 300, 500 },
{ 56, 354, 516 },
{ 65, 654, 489 }
};
int[] ints1 = new int[3];
int[] ints2 = [1, 2, 3, 4];
var tableSpan = MemoryMarshal.CreateSpan(ref table[0, 0], table.Length);
// tableSpan is linear here: [33, 300, 500, 56, 354, 516, 65, 654, 489]
tableSpan.Slice(3, ints1.Length).CopyTo(ints1);
// ints1 is now: [56, 354, 516]
ints2.AsSpan().CopyTo(tableSpan.Slice(3, ints2.Length));
// table is now:
// {
// { 33, 300, 500 },
// { 1, 2, 3 },
// { 4, 654, 489 }
// }
Upvotes: 0
Reputation: 30813
This is a case where the Buffer.BlockCopy
may come handy:
int[,] original = new int[3, 3]
{
{ 33, 300, 500 },
{ 56, 354, 516 },
{ 65, 654, 489 }
};
int[] target = new int[3];
int rowIndex = 1; //get the row you want to extract your data from (start from 0)
int columnNo = original.GetLength(1); //get the number of column
Buffer.BlockCopy(original, rowIndex * columnNo * sizeof(int), target, 0, columnNo * sizeof(int));
You will get in your target
:
56, 354, 516
Upvotes: 4
Reputation: 966
Should be something like this:
int[][] arrayComplex = {new[] {33, 300, 500},new []{56, 354, 516}, new []{65, 654, 489}};
int[] arraySingle = new int[3];
for (int i = 0; i < arrayComplex[1].Length; i++)
{
arraySingle[i] = arrayComplex[1][i];
}
foreach (var i in arraySingle)
{
Console.Write(i + " ");
}
Upvotes: 1
Reputation: 8892
var source = new int[3, 3]
{
{ 33, 300, 500 },
{ 56, 354, 516 },
{ 65, 654, 489 }
};
// initialize destination array with expected length
var dest = new int[source.GetLength(1)];
// define row number
var rowNumber = 1;
// copy elemements to destination array
for (int i = 0; i < source.GetLength(1); i++)
{
dest[i] = (int) source.GetValue(rowNumber, i);
}
Upvotes: 2