如何遍历列表,以便最后一个迭代步骤返回到第一个对象?

Jay*_*yte 1 c# list

我有一个组成飞机的点列表.我想在连续点之间创建边缘并将它们添加到另一个列表中.

这是我目前的代码:

// Get points forming the plate
ArrayList points = part.points;

// Number of points forming the plate
int pointCount = points.Count;

// Create edges
List<LineSegment> edges = new List<LineSegment>();
for (int i = 0; i < pointCount - 1; i++)
{
    // Get start and end points
    Point start = points[i];
    Point end = points[i+1];

    // Create edge
    LineSegment edge = new LineSegment(start, end);

    // Add edge to the list
    edges.Add(edge);
}
Run Code Online (Sandbox Code Playgroud)

它不太起作用,因为它不会在列表的最后一个点和第一个点之间创建最后一个边.纠正它的方法是什么?我可以使用if这样的if语句:

for (int i = 0; i < pointCount; i++)
{
    // Get start and end points
    Point start = points[i] as Point;
    Point end;
    if (i == pointCount-1) end = points[0] as Point;
    else end = points[i+1] as Point;

    // Rest of the code here
}
Run Code Online (Sandbox Code Playgroud)

但我确信有更优雅的方式来做到这一点.在Python中,我将从-1开始循环,以便第一个边实际上将最后一个点连接到第一个点,但这在C#中是不可能的.

编辑:点列表由API给出为ArrayList.

Ond*_*cny 7

"优雅"的解决方案是使用模数:

for (int i = 0; i < pointCount; i++)
{
    …
    // for i+1 == pointCount this will yield points[0]
    Point end = points[(i+1) % pointCount] as Point;
    …
}
Run Code Online (Sandbox Code Playgroud)

但是,我相信if您使用的声明更具可读性.

注意:也可以使用a List<T>代替ArrayList.