use*_*283 9 .net c# algorithm loops
我的情况就像
// radius is an int[]
for ( int i = 0; i < radius.length; ++i )
{
for ( int j = 0; j < radius.length; ++j )
{
// do some stuff
}
}
Run Code Online (Sandbox Code Playgroud)
除了我真的想要j通过范围0- radius.length,但跳过i:
{0,1,..., i-1, i+1, ..., radius.length}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法做到这一点,紧凑,优雅,高效,可读,甚至可能是正确的.
我打算如何做到这一点
for ( int i = 0; i < radius.length; ++i )
{
for ( int j = 0; j < radius.length; )
{
// do some stuff
j += j != i ? 1 : 2;
}
}
Run Code Online (Sandbox Code Playgroud)
Ian*_*Ian 13
也许您可以考虑使用continue:
// radius is an int[]
for (int i = 0; i < radius.length; ++i)
for (int j = 0; j < radius.length; ++j)
{
if (i == j)
continue;
// do some stuff
}
Run Code Online (Sandbox Code Playgroud)
这是我能想到的最简单的一个.它正好代表您想要的独立块.
如果你想要更"紧凑"(以"小"可读性为代价),你可以考虑使用多变量单循环而不是单变量嵌套循环:
int r = radius.Length;
for (i = 0, j = 0; i < r - 1 || j < r; j++) {
i += j == r ? 1 : 0;
j %= r;
if (i == j)
continue;
//do stuff
}
Run Code Online (Sandbox Code Playgroud)或者不使用的另一种选择continue(Millie Smith建议):
for (int i = 0; i < radius.length; ++i)
for (int j = 0; j < radius.length; ++j)
if (i != j) {
// do some stuff
}
Run Code Online (Sandbox Code Playgroud)
这样,至少你可以摆脱所有花括号,但是if.
注意:但我个人认为您的解决方案(使用j += j != i ? 1 : 2;)已经非常紧凑,优雅,高效,可读!很难"击败"!;)
编辑:
"很难被击败......"除了原始解决方案包含一个错误(由Ivan Stoev确定)时i == 0 && j == 0.
为了使它正确,修改后的解决方案将是这样的:
for ( int i = 0; i < radius.length; ++i )
for ( int j = 0; j < radius.length; )
{
// do some stuff
j += j != i || i + j == 0 ? 1 : 2; //i + j == 0 condition added
}
Run Code Online (Sandbox Code Playgroud)这个怎么样?
var query =
from i in Enumerable.Range(0, radius.Length)
from j in Enumerable.Range(0, radius.Length)
where i != j
select new { i, j };
foreach (var x in query)
{
/* Do stuff with x.i && x.j */
}
Run Code Online (Sandbox Code Playgroud)
我觉得这很整洁.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |