Passare una dimensione di una matrice bidimensionale in C #

Mi sono trasferito da C a C #. Ho una funzione che accetta un array. Voglio passare una dimensione di una matrice bidimensionale a questa funzione.

Il codice C sarebbe: –

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

Ora, quando voglio fare lo stesso in C #, come posso passare questo array? La definizione della funzione sarà simile a: –

 private void array_processing(ref int[] param); 

e Array sarebbero dichiarati come: –

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

Ora Come posso passare Client_ID[1] alla funzione array_processing() ??

Facendo array_processing ( ref Client_ID[1]) grida come “Wrong Number of Indices”!

Non puoi davvero farlo. C # è meno espansivo riguardo i suoi array e ti impedisce di fare manipolazioni simili a C. Questa è una buona cosa.

Hai varie opzioni:

  1. Crea un array 1D e copia la tua riga 2D su di esso.
  2. Usa una matrice frastagliata – una serie di matrici, che è più simile a ciò che ti consente di fare C.
  3. Avere un sovraccarico array_processing che richiede un array 2D e un numero di riga.

  4. Se vuoi davvero accedere a una riga 2D come array 1D, devi creare una class ‘RowProxy’ che implementerà l’interfaccia IList e ti permetterà di accedere a una sola riga:

     class RowProxy: IList { 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. Usa un’espressione lambda che perderà la semantica dell’array, ma è piuttosto interessante:

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

    Puoi usare row_5_accessor come una funzione, row_5_accessor(3) ti darà ClientId[5, 3]

Puoi usare una matrice seghettata

 // Initialize jagged array int[][] clientID = new int[3][]; for (int i=0; i 

E il tuo metodo:

 private void array_processing(ref int[] subArray); 

Basta dichiarare il metodo

 private void ParseArray(int[,] ar) { // Some work... } 
  • UDP: formato del codice

Un modo primitivo sarebbe:

 var dimNumber = 1; int[] oneDimension = new int[50]; for(var i=0; i<50; i++) { oneDimension[i] = Client_ID[dimNumber][i]; } array_processing ( ref oneDimension); 

Suggerirei di usare espressioni Lambda come nel modo in cui 5 della risposta di zmbq.

Si potrebbe dichiarare array come

 int[][] Client_ID = new[] { new int[50], new int[50], new int[50] }; 

e quindi puoi passarlo alla tua funzione array_processing

 array_processing(ref Clinet_ID[1]); 

Mi dispiace per la mancanza della mia penna.

Verso la fine della conversazione, ma ecco un esempio di matrice frastagliato per fare questo:

 string[][] rows = GetStringArray(values); string[] row = rows[0]; 

Avresti impostato il tuo array frastagliato qualcosa come:

 // rowCount from runtime data stringArray = new string[rowCount][]; for (int index = 0; index < rowCount; index++) { // columnCount from runtime data stringArray[index] = new string[columnCount]; for (int index2 = 0; index2 < columnCount; index2++) { // value from runtime data stringArray[index][index2] = value; } }