C#有一种很好的方法来迭代一个范围内的每个整数,减去其中的一个吗?

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

  1. 也许您可以考虑使用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)

    这是我能想到的最简单的一个.它正好代表您想要的独立块.

  2. 如果你想要更"紧凑"(以"小"可读性为代价),你可以考虑使用多变量单循环而不是单变量嵌套循环:

    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)
  3. 或者不使用的另一种选择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.

  1. 为了使它正确,修改后的解决方案将是这样的:

    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)


Eni*_*ity 6

这个怎么样?

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)

我觉得这很整洁.