Инициализация многомерных массивов в c # (с другими массивами) - PullRequest
11 голосов
/ 26 августа 2011

В C # можно инициализировать многомерный массив, используя константы, например:

Object[,] twodArray = new Object[,] { {"00", "01", "02"}, 
                                      {"10", "11", "12"},
                                      {"20", "21", "22"} };

Лично я считаю, что инициализация массива с жестко закодированными константами бесполезна для чего-либо, кроме тестовых упражнений. В любом случае, мне крайне необходимо инициализировать новый многомерный массив, как описано выше, с использованием существующих массивов. (Которые имеют одинаковое количество элементов, но содержимое, конечно, определяется только во время выполнения).

Пример того, что я хотел бы сделать.

Object[] first  = new Object[] {"00", "01", "02"};
Object[] second = new Object[] {"10", "11", "12"};
Object[] third  = new Object[] {"20", "21", "22"};
Object[,] twodArray = new Object[,] { first, second, third };

К сожалению, это не компилируется как допустимый код. Забавно, когда я попробовал

Object[,] twodArray = new Object[,] { {first}, {second}, {third} };

Код сделал , скомпилировал и запустил, однако результат был не таким, как хотелось - массив объектов 3 на 3, в результате получился массив массивов 3 на 1, каждый из которых имел 3 элемента , Когда это происходит, я не могу получить доступ к своему массиву, используя:

Object val = twodArray[3,3];

Мне нужно идти:

Object val = twodArray[3,1][3];

Что явно не является желаемым результатом.

Итак, есть ли способ инициализировать этот новый 2D-массив из нескольких существующих массивов, не прибегая к итерации?

Ответы [ 3 ]

5 голосов
/ 26 августа 2011

Это сработает, если вы переключитесь на неровные массивы:

int[] arr1 = new[] { 1, 2, 3 };
int[] arr2 = new[] { 4, 5, 6 };
int[] arr3 = new[] { 7, 8, 9 };

int[][] jagged = new[] { arr1, arr2, arr3 };

int six = jagged[1][2];

Редактировать Чтобы уточнить, кто найдет эту тему в будущем

Пример кода выше также неадекватен, так как приводит к массиву массивов ( объект [объект []] ), а не к зубчатому массиву ( объект [] [] ) концептуально это одно и то же, но разные типы.

1 голос
/ 26 августа 2011

Вы пытаетесь присвоить массиву ссылки на массив.Для более подробной информации, пожалуйста, прочитайте - Jagged Arrays.

Попробуйте это,

Object[] first = new Object[] { "00", "01", "02" };
Object[] second = new Object[] { "10", "11", "12" };
Object[] third = new Object[] { "20", "21", "22" };
Object[][] result = { first, second, third };

foreach (object [] ar in result)
   {
       foreach (object ele in ar)
        {
            Console.Write(" " + ele);
          }
       Console.WriteLine();
   }
1 голос
/ 26 августа 2011

Я изо всех сил пытаюсь полностью понять, чего вы действительно пытаетесь достичь.Если я правильно понял, у вас есть несколько «списков» строк, которые нужно хранить в другом списке.

Прежде всего, я бы порекомендовал вам использовать более современный подход, чем массивы.C # предлагает вам интерфейсы IEnumerable <> и IList <> и все, что происходит от них, поэтому нет необходимости использовать старомодные массивы.

Вы можете сделать что-то вроде этого:

var list1 = new List<string> { "foo1", "foo2", "foo3" };
var list2 = new List<string> { "foo4", "foo5", "foo6" };
var list3 = new List<string> { "foo7", "foo8", "foo9" };
var listOfStrings = new List<List<string>> { list1, list2, list3 };

Тогда, если вы хотите получить доступ к "foo6", вы пишете:

var temp = listOfStrings[1][2];
...