Передача одного измерения двумерного массива в C # - PullRequest
3 голосов
/ 02 марта 2012

Я перешел с C на C #.У меня есть функция, которая принимает массив.Я хочу передать одно измерение двумерного массива этой функции.

C-код будет: -

void array_processing(int * param); 

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

Теперь, когда я хочу сделать то же самое в C #, как я могупередать этот массив?Определение функции будет выглядеть так: -

private void array_processing(ref int[] param);

и массив будет объявлен как: -

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

Теперь Как я могу передать Client_ID[1] в функцию array_processing() ??

Делая array_processing ( ref Client_ID[1]), кричит как «Неверное количество индексов»!

Ответы [ 6 ]

7 голосов
/ 02 марта 2012

Вы не можете этого сделать. C # менее общителен в отношении своих массивов и не позволяет вам делать C-подобные манипуляции. Это хорошая вещь.

У вас есть различные варианты:

  1. Создайте одномерный массив и скопируйте в него свою 2D-строку.
  2. Используйте неровный массив - массив массивов, который больше похож на то, что позволяет вам делать С.
  3. Перегрузка array_processing, которая принимает двумерный массив и номер строки.

  4. Если вы действительно хотите получить доступ к 2D-строке в виде 1D-массива, вы должны создать класс 'RowProxy', который будет реализовывать интерфейс IList и позволит вам получить доступ только к одной строке:

    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. Используйте лямбда-выражение, которое потеряет семантику массива, но довольно круто:

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

    Вы можете использовать row_5_accessor как функцию, row_5_accessor(3) даст вам ClientId[5, 3]

1 голос
/ 02 марта 2012

Вы можете использовать зубчатый массив

// 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]);

И ваш метод:

private void array_processing(ref int[] subArray);
0 голосов
/ 26 сентября 2015

Поздно для разговора, но вот пример зубчатого массива, чтобы сделать это:

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

Вы бы настроили свой зубчатый массив примерно так:

// 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;
    }
}
0 голосов
/ 02 марта 2012

Вы можете объявить свой массив как

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

и затем вы можете передать его в функцию array_processing

array_processing(ref Clinet_ID[1]);

Извините за нехватку моей ручки.

0 голосов
/ 02 марта 2012

Примитивный путь будет:

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);

Я бы предложил использовать лямбда-выражения, как в способе 5 ответа zmbq.

0 голосов
/ 02 марта 2012

Просто объявите метод

private void ParseArray(int[,] ar)
{
    // Some work...
}
  • UDP: кодовый формат
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...