2014-12-17 1 views
1

У меня есть 2D массив в C#, как это:Как получить доступ и переформатируйте Jagged массив в C#

int[][] 2darray = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; 

, как я могу получить один столбец как обычный массив, как

int[] array = 2darray[1][]; //example, not working 

и имеют

int[] array = {3,4}; 

? Спасибо.

+2

'ИНТ [] []' является jagged array, а не 2d-массив. –

+0

Что вы ожидаете вернуть «столбец» - существующие ответы дадут вам N-й массив в вашем зубчатом массиве, например. '{1, 2}', если по столбцу вы имеете в виду N-й элемент каждого подматрица, например. '{1, 3, 5, 7}' вам нужно будет сделать больше работы. –

+0

Вы запрашиваете колонку или строку здесь? '{3,4}' представляется второй строкой, тогда как мне кажется, что, например, первая _column_ должна быть '{1,3,5,7}'. – heltonbiker

ответ

0

попробовать это, он должен работать

int[] array = array2d[1]; 

Изменение имени переменной в array2d, вы не можете иметь переменную, которая начинается с числа, переменная может начинаться с буквы или символа подчеркивания.

4

Есть несколько причин, почему ваш код не может скомпилировать

Этот способ работает:

int[][] array2d = { new[]{ 1, 2 }, new[]{ 3, 4 }, new[]{ 5, 6 }, new[]{ 7, 8 } }; 

int[] array = array2d[0]; 

Проблемы:

  • 2darray не является допустимым именем переменной
  • неверно индексирование
  • Инициализация из исходного массива является неправильным


EDIT: Как заявил @heltonbiker, если требуется, чтобы все элементы первого столбца, вы можете использовать это:

int[] col = array2d.Select(row => row[0]).ToArray(); 
+1

Похоже, что OP ошибся, ему нужна колонка, см. Комментарии в оригинальном вопросе. – heltonbiker

+0

int [] array = array2d [0]; Это именно то, что я искал. Благодарю. (array2d - это массив, функция которого получает как parametr | 2darray, возможно, недопустимое имя, я написал это как пример. Даже остальное, как я думал, это может сработать.) – parman

3

Для массива с двумя колонны и четыре строки, вы можете использовать Linq таким образом:

using System.Linq; 

first_column = _2darray.Select(row => row[0]).ToArray(); 

Обратите внимание, что изменения первой или второй массив не изменит другой.

+0

Я не говорю, что это единственное, даже не лучшее решение. Но это, безусловно, решение. – heltonbiker

+0

(и ОП никогда не говорил, что ему нужно изменить исходный массив) – heltonbiker

+0

Не поймал часть столбца. Виноват. Добавлена ​​заметка к вашему ответу, разъясняющая мои предыдущие проблемы. Если вам это не нравится, пожалуйста, вернитесь. +1 –

2

Вы ошибаетесь jagged arrays и multidimensional arrays в C#. Хотя они похожи, есть небольшая разница. Строки в зубчатом массиве могут иметь различное количество элементов, тогда как в 2D-массиве они имеют одинаковую длину. Поэтому при работе с зубчатыми массивами необходимо помнить, что нужно писать обработку для элемента отсутствующего столбца. Я написал консольное приложение примера ниже, чтобы показать, как оба они работают - он использует 0 в качестве замены для недостающего элемента, но вы можете бросить ошибку и т.д .:

using System.Collections.Generic; 

namespace JaggedArrayExample 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //jagged array declaration 
      int[][] array1; 

      //jagged array declaration and assignment 
      var array2 = new int[][] { 
          new int[] { 1, 2 }, 
          new int[] { 3, 4 }, 
          new int[] { 5, 6 }, 
          new int[] { 7, 8 } 
         }; 

      //2D-array declaration 
      int[,] array3; 

      //2D-array declaration and assignment (implicit bounds) 
      var array4 = new int[,] {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; 

      //2D-array declaration and assignment (explicit bounds) 
      var array5 = new int[4, 2] {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; 

      //get rows and columns at index 
      var r = GetRow(array2, 1); //second row {3,4} 
      var c = GetColumn(array2, 1); //second column {2,4,6,8} 
     } 

     private static int[] GetRow(int[][] array, int index) 
     { 
      return array[index]; //retrieving the row is simple 
     } 

     private static int[] GetColumn(int[][] array, int index) 
     { 
      //but things get more interesting with columns 
      //especially if jagged arrays are involved 
      var retValue = new List<int>(); 
      foreach (int[] r in array) 
      { 
       int ub = r.GetUpperBound(0); 
       if (ub >= index) //index within bounds 
       { 
        retValue.Add(r[index]); 
       } 
       else //index outside of bounds 
       { 
        retValue.Add(0); //default value? 
        //or you can throw an error 
       } 
      } 
      return retValue.ToArray(); 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^