Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get a complete row or column from 2D array in C#

I do not want to use a jagged array and I have a 2D array and I want to get a complete column or row without looping through it. Does anyone have an idea how it can be done.

double [,]  array = new double [3,3] ;  1   2   3  4   5   6  Out: 1   2   3  or 2   5  
like image 321
User1551892 Avatar asked Dec 11 '14 16:12

User1551892


People also ask

How do you find the rows of a 2D array?

We use arrayname. length to determine the number of rows in a 2D array because the length of a 2D array is equal to the number of rows it has. The number of columns may vary row to row, which is why the number of rows is used as the length of the 2D array.

Is a 2D array row column or column row?

2D Arrays (Day 1) Arrays in Java can store many items of the same type. You can even store items in two-dimensional (2D) arrays which are arrays that have both rows and columns.


2 Answers

To get a specific row or column from the multidimensional array you can use some LINQ:

public class CustomArray<T> {     public T[] GetColumn(T[,] matrix, int columnNumber)     {         return Enumerable.Range(0, matrix.GetLength(0))                 .Select(x => matrix[x, columnNumber])                 .ToArray();     }      public T[] GetRow(T[,] matrix, int rowNumber)     {         return Enumerable.Range(0, matrix.GetLength(1))                 .Select(x => matrix[rowNumber, x])                 .ToArray();     } } 
like image 57
Alex Podles Avatar answered Sep 17 '22 19:09

Alex Podles


You can optimise it for getting rows by using Buffer.BlockCopy(), but to get a column you'll have to loop. Buffer.BlockCopy() ultimately uses a processor instruction to copy a block of memory, so it is pretty fast.

It's convenient to put the code into an extension method to make it easier to call. Note that Buffer.BlockCopy() can only be used on arrays of primitive types, i.e. int, double, char etc. This does NOT include string.

Here's a compilable example:

using System; using System.Linq; using System.Runtime.InteropServices;  namespace ConsoleApplication4 {     public static class Program     {         private static void Main()         {             var array = new [,]             {                 {0.1, 0.2, 0.3, 0.4, 0.5},                 {1.1, 1.2, 1.3, 1.4, 1.5},                 {2.1, 2.2, 2.3, 2.4, 2.5},                 {3.1, 3.2, 3.3, 3.4, 3.5},             };              var row = array.GetRow(2);              // This prints 2.1, 2.2, 2.3, 2.4, 2.5              Console.WriteLine(string.Join(", ", row.Select(element => element.ToString())));         }     }      public static class ArrayExt     {         public static T[] GetRow<T>(this T[,] array, int row)         {             if (!typeof(T).IsPrimitive)                 throw new InvalidOperationException("Not supported for managed types.");              if (array == null)                 throw new ArgumentNullException("array");              int cols = array.GetUpperBound(1) + 1;             T[] result = new T[cols];              int size;              if (typeof(T) == typeof(bool))                 size = 1;             else if (typeof(T) == typeof(char))                 size = 2;             else                 size = Marshal.SizeOf<T>();              Buffer.BlockCopy(array, row*cols*size, result, 0, cols*size);              return result;         }    } } 
like image 35
Matthew Watson Avatar answered Sep 17 '22 19:09

Matthew Watson