2015-01-06 2 views
0

У меня есть 2d массив строк (по крайней мере, я думаю, что это называется 2d массив):Как перебирать многомерный массив строк?

var target = new string[var1,var2]; 

Теперь я хочу, чтобы преобразовать его в List<List<string>>:

var listlist = new List<List<string>>(); 
foreach (var row in target) 
{ 
    var newlist = new List<string>(); 
    foreach (var el in row) 
    { 
    newlist.Add(el); 
    } 
    listlist.Add(newlist); 
} 

Но строка имеет тип string и el имеет тип char.

Я не могу понять, почему el не является string? Что не так?

+2

При перечислю 'строка []', вы получите 'string'. Когда вы перечисляете строку, вы получаете 'char', потому что она реализует' IEnumerable '. Какой смысл вы не поняли? –

+1

Если это правильно, так как я могу создать массив строк 2d? –

ответ

5

A foreach interates более в string[,], как это string[]. Он не разбивается на строки.

Если вы хотите обработать «строки» и «столбцов» те, по отдельности, вы должны получить размеры массива, используя GetLength метод:

var target = new string[var1, var2]; 

var listlist = new List<List<string>>(); 
for (int x = 0; x < target.GetLength(0); x++) 
{ 
    var newlist = new List<string>(); 
    for (int y = 0; y < target.GetLength(1); y++) 
    { 
     newlist.Add(target[x, y]); 
    } 
    listlist.Add(newlist); 
} 
+0

Спасибо, теперь я вижу свою ошибку. –

2

Это то, что вам нужно

static void SoStrList() 
    { 
     int var1=10, var2=7; 
     var target=new string[var1, var2]; 

     var listlist=new List<List<string>>(); 

     for(int i=0; i<var1; i++) 
     { 
      var row=new List<string>(); 
      for(int j=0; j<var2; j++) 
      { 
       row.Add(target[i, j]); 
      } 
      listlist.Add(row); 
     } 
    } 
1

использование for петли вместо foreach

 var target = new string[2, 2]; 
     target[0, 0] = "a"; 
     target[0, 1] = "A"; 
     target[1, 0] = "b"; 
     target[1, 1] = "B"; 

     var listlist = new List<List<string>>(); 

     for (int i = 0; i < target.GetLength(0); i++) 
     { 
      var newlist = new List<string>(); 

      for (int j = 0; j < target.GetLength(1); j++) 
       newlist.Add(target[i,j]); 

      listlist.Add(newlist); 
     } 
0

Здесь:

foreach (var row in target) 

У вас уже есть первый элемент вашего 2d массива, и foreach берет все символы этих элементов

0

well ... string is array of chars. И эта путаница - это то, что вы получаете от использования ключевого слова var практически для всего. Это не javascript.

Во-вторых: Вы должны пойти на что-то вроде этого

for (int i = 0; i < target.GetLength(0); i++) 
     { 
      for (int y = 0; y < target.GetLength(1); y++) 
      { 
       your manipulation with strings 
      } 
     } 

но srsly ... избавиться от Варс !!!

0

Для любителей LINQ, то же самое может быть достигнуто с помощью следующих двух строк:

int R = s.GetLength(0), C = s.GetLength(1); 
var MyList = Enumerable.Range(0, R).Select(i => i * C).Select(i => s.Cast<string>.Skip(i).Take(C).ToList()).ToList(); 
Смежные вопросы