Многомерный цикл foreach - PullRequest
       8

Многомерный цикл foreach

0 голосов
/ 12 октября 2018

Как я могу правильно сделать так, чтобы проверка выполнялась для каждой строки?

Мой код выглядит так:

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";

и позже необходимо получить эти значения в цикле (пропуская значения, которые не существуют или не были объявлены)

Спасибо за помощь.

Ответы [ 4 ]

0 голосов
/ 12 октября 2018

На самом деле ваш блок 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 миллисекунду.

0 голосов
/ 12 октября 2018

Для хранения вы бы использовали индексы строк и столбцов, такие как:

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]}");
    }
}
0 голосов
/ 12 октября 2018

Вы можете использовать fored для двухмерного массива.Вы можете даже 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);
}
0 голосов
/ 12 октября 2018

Я не знаю про циклы 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 { };
    }
}
...