多维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;
我怎样才能正确地执行检查每个字符串?
我的代码如下:
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;