我不熟悉在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;
我的困惑在于从循环内部进行删除的地方。采取这条线
vertices.erase(vertices.begin() + i);
这等效于List<Vector3>
RemoveAt(i)
方法,但在C#中无法在循环内完成。在C#中构造此代码的最简单方法是,对逻辑和流程进行尽可能少的更改?
内部循环可以简化很多,在C#中应该很容易:
注意循环中没有增量运算符吗? it
将始终指向向量的开头。
因此对于内部循环,我们可以在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
循环中没有增量项,这在else
语句中已解决。我们可以在此处从列表中删除项目,因为.Count
将始终在每次迭代时求值。我们没有修改要迭代的列表,因为没有活动的迭代器(如果使用foreach
循环,则将有所不同)。
因此您可以对外部循环执行相同的操作,因为它显示vertices.erase(vertices.begin() + i);
,您只需在C#中将其替换为vertices.RemoveAt(i)
。