2016-08-20 5 views
0

У меня есть список массивов, где я добавил много массивов, но все они одного размера. Теперь я хочу преобразовать этот список в двумерный массив. Я пытался таким образом:Как преобразовать Список массивов в двумерный массив?

List<Array^>^ vList = gcnew List<Array^>(); 
//some code where I add elements to vList 
array<String ^, 2>^anArray = gcnew array<String ^, 2>(vList->Count, 5); 
anArray = vList->ToArray(); 

Но я получил эту ошибку:

a value of type "cli::array<System::Array ^, 1> ^" cannot be assigned to an entity of type "cli::array<System::String ^, 2> ^" 

Я не знаю, как преобразовать его.

+0

Выбирайте правильные типы, попадайте в яму успеха с помощью 'List ^> ^', чтобы вы прибивали тип элемента и не должны иметь дело с тем, что у вас есть элемент массива, который не строка. И неровный массив вместо двумерного массива (массив ^> ^), поэтому ToArray() может работать. Также намного быстрее. –

+0

К сожалению, это не сработает. 'cli :: array ^tablica2D;' работает, но это не то, что я хотел, и я не могу получить элемент с заданным индексом. –

ответ

1

Вам придется перебирать и копировать все строки отдельно. Однако необработанный тип Array^ не подходит для работы, поэтому вам нужно что-то сделать.

В принципе, то, что вам нужно сделать, это:

for (int outer = 0; outer < vList->Count; outer++) 
{ 
    arrayOfSomeSort^ innerArray = vList[outer]; 
    for (int inner = 0; inner < innerArray.Length; inner++) 
     anArray[outer, inner] = innerArray[inner]; 
} 

В зависимости от того, как остальная часть программы, и какие объекты на самом деле в списке, есть несколько вариантов, что делать. Вот варианты, которые я вижу, в порядке предпочтения.

  1. Вместо List<Array^>^, имеют vList быть List<array<String^>^>^. Если List действительно представляет собой список массивов строк, то этот вариант, вероятно, является наиболее правильным. В этом случае arrayOfSomeSort^ будет array<String^>^.
  2. Если vList не может изменить тип, но это действительно содержит строковые массивы, то я бы локальная переменная innerArray быть типа array<String^>^, и сделать бросок, как вы вытащите его из vList.
  3. Если массивы в списке не являются строковыми массивами, но вместо этого представляют собой массивы объектов, которые содержат строки, тогда у меня будет array<Object^>^ innerArray, и вместо этого сделайте это вместо этого и сделайте приведение к String^, когда вы вытащите каждую строку из innerArray.
  4. Если ни один из них не подходит, вы можете оставить innerArray как тип Array^. Вам нужно будет вызвать явный метод Array.GetValue(int) вместо индексатора []. Как и в предыдущем варианте, вам нужно будет отбросить каждую строку, когда вы вытащите ее из внутреннего массива.

Вы установили второе измерение в 5 без проверки длины внутренних массивов; Я предполагаю, что вы знаете то, чего у нас нет, и уверены, что не будет ничего большего, чем 5. Если нет, вам нужно будет перебирать список один раз, чтобы получить максимальный размер массива, создать 2D-массив, а затем скопируйте строки.

+0

Да, второе измерение - 5, и оно жестко запрограммировано. У меня есть список массивов с тем же (= 5) размером. К сожалению, я получаю сообщение об ошибке «Значение типа« System :: Object^»не может быть назначено сущности типа« System :: String^»« Я также попробовал «anArray [внешний, внутренний] = (String ^) innerArray [ inner]; 'but' 'default': не является членом ошибки «System :: Array». –

+0

Бах, вот что я получаю для ввода ответа без проверки его в компиляторе.Если 'Array ^' в списке на самом деле 'array ^', то лучшим решением было бы переключить 'List ^' на 'List ^> ^'. Если это невозможно, тогда я сделаю бросок 'innerArray' в' array ^', когда вы вытащите его из списка. Если они являются 'array ^', то вместо этого накладывайте их на это, а отдельные элементы на 'String ^', как вы пробовали. Если ни один из них не работает, вы можете вызвать метод GetValue (int) в 'Array ^' и преобразовать результат в 'String ^'. –

+0

Он работает! Спасибо. –

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