多维foreach循环

Multi-dimensional foreach loop

我怎样才能正确地执行检查每个字符串?

我的代码如下:

string[,] screeny_baza = new string[300, 300];
for (int i = 0; i < 299; i++)
{
    try
    {
        string nazwa_screna_pokolei = screeny_baza[0,i]
    }
    catch { };
}

如我所见,我想一个一个地完成。是否可以更快地省略不存在或未声明的值?我认为它们只是空值。

我的尺寸看起来像 300/300 。

   X0 X1 X2
Y0 00 10 20
Y1 01 11 21
Y2 02 12 22

并且只想将字符串保存到每个维度,例如

string [00] = "bird";
string [01] = "bird2";

以后需要循环获取这个值(省略不存在或未声明的值)

感谢您的帮助。

我不知道多维数组上的 foreach 循环,但你总是可以这样做:

string[,] screeny_baza = new string[300, 300];
for (int x = 0; x < screeny_baza.GetLength(0); x++)
{
    for (int y = 0; y < screeny_baza.GetLength(1); y++)
    {
        try
        {
            string nazwa_screna_pokolei = string.empty;
            if (screeny_baza[x, y] != null)
                nazwa_screna_pokolei = screeny_baza[x, y];
        }
        catch { };
    }
}

为了存储,您可以使用行和列索引,例如:

screeny_baza[0,0] = "bird";
screeny_baza[0,1] = "bird";

要循环使用 GetLength 的值(虽然您知道维度是常数,但这是一种更灵活的方法):

for (int row = 0; row < screeny_baza.GetLength(0); row++) {
    for (int col = 0; col < screeny_baza.GetLength(1); col++) {
        if (!string.IsNullOrEmpty(screeny_baza[row,col])) // if there is a value
        Console.WriteLine($"Value at {row},{col} is {screeny_baza[row,col]}");
    }
}

您可以在二维数组上进行 foreach。你甚至可以在 LinQ Where 中过滤它。

var table = new string[20, 20];
table[0, 0] = "Foo";
table[0, 1] = "Bar";

foreach (var value in table.Cast<string>().Where(x =>!string.IsNullOrEmpty(x))) {
    Console.WriteLine(value);
}

实际上您的 try-catch 块不会引发任何异常,因为当您构造数组时:

string[,] screeny_baza = new string[300, 300];

只要索引在范围内,您就可以随时对其进行索引;所以声明:

string nazwa_screna_pokolei = screeny_baza[0,i];

将无误地执行。只是 nazwa_screna_pokolei 将为空;

此外,如果考虑速度,嵌套 for 循环比 LinQ 快得多。至少对于这个简单的检查。例如:

var list = screeny_baza.Cast<string>().Where(x => !string.IsNullOrEmpty(x)).ToList();

大约需要 10 毫秒,但是

for (int i = 0; i < 300; i++)
{
    for (int j = 0; j < 300; j++)
    {
        if (string.IsNullOrEmpty(screeny_baza[i,j]))
        {
            continue;
        }
            list.Add(screeny_baza[i, j]);
    }
}

只需 1 毫秒。

这种情况下我的简单帮手

    private static void forEachCell(int size, Action<int, int> action)
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                action(j, i);
            }
        }
    }

可以修改为使用不同的尺寸。 使用示例:

        double totalProbability = 0;

        forEachCell(chessboardSize, (row, col) =>
            totalProbability += boardSnapshots[movesAmount][row, col]);

        return totalProbability;