多维foreach循环

时间:2018-10-12 13:21:40

标签: c# dimensions

如何正确地检查每个字符串?

我的代码如下:

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

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

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

然后需要循环获取此值(忽略不存在或尚未声明的值)

感谢帮助。

5 个答案:

答案 0 :(得分:2)

我不知道多维数组上的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 { };
    }
}

答案 1 :(得分:1)

您可以在二维数组上进行eacheach。您甚至可以在LinQ的位置对其进行过滤。

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

答案 2 :(得分:1)

实际上,您的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毫秒。

答案 3 :(得分:0)

对于存储,您将使用行和列索引,例如:

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

答案 4 :(得分:0)

我是这类情况的简单帮手

    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;