Инициализация многомерных массивов в С# (с другими массивами)

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

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-массив из нескольких существующих массивов, не прибегая к итерации?

Ответ 1

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

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

Изменить. Чтобы уточнить, кто может найти этот поток в будущем

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

Ответ 2

Вы пытаетесь назначить ссылки массива массиву. Подробнее читайте - 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();
   }

Ответ 3

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

Прежде всего, я бы рекомендовал использовать более современный подход, чем массивы. С# предлагает вам интерфейсы 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];