Изменение вектора внутри L oop с помощью C ++ и C# Analog - PullRequest
0 голосов
/ 08 апреля 2020

Я не знаком с удалением элементов из векторов на лету в C ++, и у меня есть требование перевести блок кода в C#. Следующий код - это C ++

for(unsigned int i = 0; i < vertices.size(); i++) {
  if (vertices[i].z < 0) { // make hemisphere
      vertices.erase(vertices.begin() + i);

      // delete all triangles with vertex_i
      int t = 0;
      for (std::deque<unsigned int>::iterator it = triangles.begin();
          it != triangles.end();) {
          if (triangles[t] == i || triangles[t + 1] == i ||
              triangles[t + 2] == i) {
              it = triangles.erase(it);
              it = triangles.erase(it);
              it = triangles.erase(it);
          }
          else {
              ++it;
              ++it;
              ++it;
              t += 3;
          }
      }
      // update indices
      for (unsigned int j = 0; j < triangles.size(); j++) {
          if (triangles[j] > i) {
              triangles[j]--;
          }
      }
      i--;
  }    
// More code here...

, где

std::vector<Vector3d> vertices;
std::deque<unsigned int> triangles;

Моя путаница возникает, когда удаление происходит изнутри l oop. Возьмем эту строку

vertices.erase(vertices.begin() + i);

Это эквивалентно методу List<Vector3> RemoveAt(i), но в C# это нельзя сделать внутри l oop. Какой самый простой способ построить этот код в C# с минимальными изменениями в логике c и потоке, насколько это возможно?

1 Ответ

2 голосов
/ 08 апреля 2020

Внутренний l oop может быть значительно упрощен, в C# это должно быть довольно просто:

Так что для внутреннего l oop мы можем сделать то же самое в C#:

for (int it = 0; it < triangles.Count;)
{
    if (triangles[t] == i || triangles[t+1] == i || triangles[t+2] == i)
    {
        triangles.RemoveRange(it, 3);
    }
    else
    {
        it += 3;
        t += 3;
    }
} 

Обратите внимание, что в for l oop нет члена приращения, это учтено в операторе else. Здесь мы можем удалить элементы из списка, потому что .Count всегда будет оцениваться на каждой итерации. Мы не изменяем список, для которого мы выполняем итерацию, потому что нет активного итератора (это было бы иначе, если бы мы использовали foreach l oop).

Таким образом, вы можете сделать то же самое для внешнего l oop, где он показывает vertices.erase(vertices.begin() + i);, вы можете просто заменить его в C# на vertices.RemoveAt(i).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...