Crysthius
Crysthius

Reputation: 119

Copy single row from multidimensional array into new one dimensional array

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

Answers (4)

roxton
roxton

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

Ian
Ian

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

MKMohanty
MKMohanty

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

Vadim Martynov
Vadim Martynov

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

Related Questions