Как зациклить список - PullRequest
       14

Как зациклить список

0 голосов
/ 15 марта 2012

Может кто-нибудь помочь, пожалуйста.

У меня есть проблема, когда мне нужно перебрать 3 строки и проверить, пересекаются ли они, используя C #.3 линии составят общую форму треугольника.Поэтому только 2 линии будут когда-либо пересекаться одновременно.

У меня есть 3 объекта Line, и я сохранил их в строках List.Мой метод проверки пересечений в настоящее время выглядит следующим образом:

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.

У кого-нибудь есть какие-либо предложения.

Ответы [ 3 ]

1 голос
/ 15 марта 2012
for (int i = 0; i < lines.Count; i++)
{
        ProcessIntersection(lines[i], lines[i == lines.Count -1 ? 0 : i + 1]);
}
1 голос
/ 15 марта 2012

Попробуйте следующий цикл:

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 голос
/ 15 марта 2012

Если вы хотите проверить каждую строку с ее преемником, а затем последнюю строку со строками [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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...