如何遍历多维字符串数组?

How to iterate over a multidimensional string array?

我有一个二维字符串数组(至少我认为它被称为二维数组):

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);
}

但是行的类型是 stringel 的类型是 char

我不明白为什么 el 不是 string?怎么了?

这就是你需要的

    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);
        }
    }

A foreachstring[,] 交互,就像 string[] 一样。它不会按行拆分。

如果您确实想分别处理 'rows' 和 'columns',您必须使用 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);
}

使用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);
        }

这里:

foreach (var row in target)

您已经有了二维数组的第一个元素,并且 foreach 获取该元素的所有字符

嗯...字符串是字符数组。 这种混淆是您对几乎所有内容都使用关键字 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...摆脱 vars!!!

对于 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();