Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing one Dimension of a Two Dimensional Array in C#

I have moved from C to C#. I have a function which accepts an array. I want to pass one dimension of a Two Dimensional array to this function.

C Code would be:-

void array_processing(int * param); 

void main()
{
  int Client_ID[3][50];
  /* Some 
     Processing 
     which fills 
     this array */
    array_processing(&Client_ID[1]);
}

Now, When I want to do same in C#, How can I pass this array? Function defination will look like:-

private void array_processing(ref int[] param);

and Array would be declared as :-

int[,] Client_ID = new int[3,50];

Now How can I pass Client_ID[1] to the function array_processing()??

By doing array_processing ( ref Client_ID[1]) shouts as "Wrong Number of Indices"!

like image 925
Swanand Avatar asked Feb 22 '23 06:02

Swanand


2 Answers

You can't really do that. C# is less outgoing about its arrays, and prevents you from doing C-like manipulations. This is a good thing.

You have various options:

  1. Create a 1D array and copy your 2D row to it.
  2. Use a jagged array - an array of arrays, which is more like what C lets you do.
  3. Have an array_processing overload that takes a 2D array and a row number.

  4. If you really want to access a 2D row as a 1D array, you should create a 'RowProxy' class that will implement the IList interface and let you access just one row:

    class RowProxy<T>: IList<T>
    {
        public RowProxy(T[,] source, int row)
        { 
           _source = source;
           _row = row;
        }
    
        public T this[int col]
        {
            get { return _source[_row, col]; } 
            set { _source[_row, col] = value; }
        }
    
        private T[,] _source;
        private int _row;
    
        // Implement the rest of the IList interface
    }
    
  5. Use a lambda expression that will lose the array semantics, but is rather cool:

    var ClientId = ...;
    
    var row_5_accessor = (c=>ClientId[5, c]);
    

    You can use row_5_accessor as a function, row_5_accessor(3) will give you ClientId[5, 3]

like image 84
zmbq Avatar answered Feb 23 '23 20:02

zmbq


You can use a jagged array

// Initialize jagged array
int[][] clientID = new int[3][];
for (int i=0; i<clientId.Length; i++)
{
   clientId[i] = new int[50];
}

array_processing(ref clientId[1]);

And your method:

private void array_processing(ref int[] subArray);
like image 44
Tung Avatar answered Feb 23 '23 21:02

Tung