string[,] cusName = { { "John", "Smith" }, { "Will", "James"} , { "Bryan", "Doe" } };
for (int x = 0; x < cusName.GetLength(x); x++)
{
for (int j = x + 1; j < cusName.GetLength(j); j++)
{
Console.Write("{0} ", cusName[x, j]);
}
Console.Write("{0} ", cusName[x, j]);
}
我的问题是最后Console.Write
总是会产生错误。它表示变量j
在当前上下文中不存在。
答案 0 :(得分:2)
正如其他人已在评论中指出的那样,您无法在声明的循环之外访问j
。因此,您必须在循环之前声明j
,或以与重用j
不同的方式访问最后一个索引。
话虽如此,目前还不清楚你想对你的代码做什么,而且你可能根本不想在那里拥有Console.Write
。
你的代码btw存在很大问题:
for (int x = 0; x < cusName.GetLength(x); x++)
只要它小于x
,此for循环将递增cusName.GetLength(x)
。 Array.GetLength
用于获取多维数组中维度的元素计数。由于您的数组有两个维度,因此您可以对GetLength
进行的仅有效调用对于第一个维度为GetLength(0)
,对于第二个维度为GetLength(1)
。在那里有变量,特别是在循环内递增的变量很可能会破坏。
我认为你原本想做这样的事情:
for (int x = 0; x < cusName.GetLength(0); x++)
{
for (int j = 0; j < cusName.GetLength(1); j++)
{
Console.Write("{0} ", cusName[x, j]);
}
}
如果你想在循环后继续使用循环变量,你可以在之前声明它:
int j;
for (j = 0; j < cusName.GetLength(1); j++)
{
…
}
Console.Write(j);
请注意,在循环之后,j
具有值cusName.GetLength(1)
,因为这是循环的工作方式:在每次循环迭代之后,变量将递增,并且循环体将被执行,如果条件(j < cusName.GetLength(1)
)是真的。所以for循环总是以循环变量的另一个增量结束。
这意味着如果您使用循环变量作为索引,那么循环后该索引将超出数组的范围。因此,如果要重用变量,应该记住这一点。
通常情况下,如果不使用循环变量,而是再次单独计算最后一个索引,则更容易,更清晰:
cusName[x, cusName.GetLength(1) - 1])
答案 1 :(得分:2)
如果我想要循环的半全局变量。那我应该用一段时间?我是对的吗?
不完全。所使用的循环类型和变量范围并不像您想象的那样密切相关。
第一个&#34;参数&#34; for循环的意思是用于变量声明和初始化,但实际上你可以(ab)使用它来执行任何有效的语句。 (不要!它不是编写干净和可维护代码的方法)。您甚至可以将其留空并使用您之前在其他地方声明的变量:
var j = 42;
for(; j > 0; --j)
{
/* do something */
}
/* now, j is still in scope */
Console.WriteLine(j);
强烈建议不要这样做,因为它的可读性低于普通语法,你需要知道一个更加模糊的信息:最后一个循环执行后循环变量的值(它是由中断条件加一个递增/递减) - 这很容易出错并引入一次性错误。
很少有C#初学者知道C#循环语法(与C有许多相似之处)根本不限于for(declaration; condition; increment)
模式。如果您想开始混淆的C#代码竞赛,以下是有效且有效的代码:
for (int i = 11, j = new Random().Next(33) + 1; i * j < 65536; Console.WriteLine(++j))
{
++i;
}
答案 2 :(得分:1)
在for
循环中定义变量时,如for(int j=...)
中那样,该变量仅存在于循环内。如果要在循环外访问该变量,请在外部声明:
int j;
for(j = ...)
答案 3 :(得分:1)
您应该修改您的代码,如下所示:
string[,] cusName = { {"John", "Smith"}, {"Will","James"}, { "Bryan", "Doe" } };
int j=0;
for(int x = 0; x < cusName.GetLength(x); x++)
{
for (j = x + 1; j < cusName.GetLength(j); j++)
{
Console.Write("{0} ", cusName[x,j]);
}
Console.Write("{0} ", cusName[x, j]);
}