2012-03-15 104 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]); 
}