2016-12-25 2 views
1

У меня есть 2D-массив типа string, который я хочу изменить и изменить размер внутри некоторого цикла. Моя основная цель - использовать минимальную память, создав 2d-массив, который будет модифицировать каждую итерацию цикла и добавить символ в соответствующую ячейку в этом массиве. Вот мой код:Изменение размера и инициализация 2D-массива C#

static void Main(string[] args) 
    { 
     int maxBound = 100;//length of freq array 
     Random rnd1 = new Random(); 
     int numLoops = rnd1.Next(1000, 1200);//number of total elements in freq array 
     int[] freq = new int[maxBound];//freq array 
     string[,] _2dim = new string[maxBound, numLoops];//rows,columns 
     Random rnd2 = new Random(); 

     for (int i = 0; i < numLoops; i++) 
     { 
      int s = rnd2.Next(maxBound); 
      freq[s]++; 
      //Here I try to add `*` to the _2dim array while resizing it to the appropriate size 

     } 
    } 

Каков основной подход к решению? Thanks

+1

1. Вы не можете изменять размеры массивов 2. Используйте два для циклов для итерации по всем элементам –

+0

Могу ли я использовать вместо этого что-то вроде List of Lists? – axcelenator

+1

Да абсолютно - я думаю, что это подход, который вы должны использовать –

ответ

3

Вместо 2D массива вы можете захотеть использовать зубчатую один. Вкратце, 2D-массив всегда представляет собой матрицу N x M, которую вы не можете изменить, тогда как зубчатый массив представляет собой массив массивов, где вы можете отдельно инициализировать каждый внутренний элемент разным размером (см. Различия в деталях here)

int maxBound = 100; 
Random rnd = new Random(); 
int numLoops = rnd.Next(1000, 1200); 

string[][] jagged = new string[numLoops][]; 

for (int i = 0; i < numLoops; i++) 
{ 
    int currLen = rnd.Next(maxBound); 
    jagged[i] = new string[currLen]; 

    for (int j = 0; j < currLen; j++) 
     jagged[i][j] = "*"; // do some initialization 
} 
1

Вы должны использовать список типов string, вложенных в список. Затем вы можете изменить эти списки. Для итерации через это вы должны использовать два для циклов.

List<List<string>> l = new List<List<string>> { new List<string> { "a", "b" }, new List<string> { "1", "2" } }; 

Итерация пример:

for(int i = 0; i < l.Count; i++) 
     { 
      for(int j = 0; j < l[i].Count; j++) 
      { 
       Console.WriteLine(l[i][j]); 
      } 
     } 
Смежные вопросы