2012-03-15 53 views
0

任何人都可以请帮忙。如何通过列表循环

我有一个问题,我需要通过3行循环,并检查它们是否使用C#相交。三条线将构成三角形的一般形状。因此,一次只会有两条线相交。

我有3个线对象,我已经将它们存储在列表行中。 我的方法来检查交叉口目前看起来是这样的:

ProcessIntersections(lines[0], lines[1]) 
ProcessIntersections(lines[1], lines[2]) 
ProcessIntersections(lines[2], lines[0]) 

通过列表循环一次,我可以做,但检查最终的交集,我一定要在第一线再次通过,并检查其对最后线。

有没有更好的方法来处理我的十字路口? 如何通过只调用一次ProcessIntersections来遍历行列表? 我想:

for (int i = 0; i < lines.Count; i++) 
{ 
    if (i >= 3) 
    { 
     i = 0; 
     ProcessIntersection(lines[i], lines[i + 1]); 
    } 
} 

但是,这只是我的土地在一个无限循环,因为我不断重置为0。

没有人有任何建议。

+0

为什么一个问题,叫'ProcessInteractions'多次?如果这个方法比较两条线的交集,那么它就是你想要的第一个代码示例。创建方法的要点是能够重复使用代码并用不同的输入多次调用它。 – jzworkman 2012-03-15 16:19:07

+1

如果您只有3行然后lines.Count = 3 - >这意味着我将永远不会> = 3 。 – 2012-03-15 16:22:02

回答

1

尝试下一个循环:

for (int i = 0; i < lines.Count; i++) 
{ 
    var next_i = i + 1; 
    if (next_i >= lines.Count) 
    next_i = 0; 
    ProcessIntersection(lines[i], lines[next_i]); 
} 

或优化的循环:

for (int i = 0; i < lines.Count; i++) 
{ 
    ProcessIntersection(lines[i], lines[(i + 1) % lines.Count]); 
} 
1

如果您要检查其继任者的每一行,然后用线最后一行[0],你可以这样做:

for(int i = 0;i < lines.Count - 1;++i) 
    ProcessIntersection(lines[i], lines[i + 1]); 
if(lines.Count > 1) 
    ProcessIntersection(lines[lines.Count - 1], lines[0]); 

如果你真的想在它的所有处理for()循环(这会对速度产生负面影响),你可以这样做:

for(int i = 0;i < lines.Count;++i) 
    ProcessIntersection(lines[i], lines[i == lines.Count - 1 ? 0 : i + 1]); 
1
for (int i = 0; i < lines.Count; i++) 
{ 
     ProcessIntersection(lines[i], lines[i == lines.Count -1 ? 0 : i + 1]); 
}