我将顶点保留在列表中,我只想在列表中添加一个顶点(如果它还没有包含它)。如果它不包含它我将它添加到列表然后将索引添加到名为tris的列表。但是,如果列表确实包含顶点,则应找到其所在位置的索引,然后将该索引添加到tris列表中。这是我发现的最快的方法。有更快的方法吗?
Hashtable vertIndexes;
List<Vector3> verts;
List<int> tris;
foreach (var vert in vertsOutput)
{
Vector3 p = point + vert;
if(!vertIndexes.Contains(p))
{
vertIndexes.Add(p, verts.Count);
tris.Add(verts.Count);
verts.Add(p);
}
else
{
tris.Add((int)vertIndexes[p]);
}
}
答案 0 :(得分:3)
目前,您正在为每个项目执行两次哈希表操作。你可以保存一个:
Dictionary<Vector3, int> vertIndexes;
...
int index;
if(vertIndexes.TryGetValue(p, out index))
//present at given index
else
//not present
TryGetValue
同时测试存在并返回存储的值。
使用自定义哈希表可能会更快。 Dictionary
有一些开销需要通用性而且你不需要。例如,它使用的模数运算符非常昂贵,并且具有良好的哈希码是不必要的。但这超出了这个答案的范围。
答案 1 :(得分:1)
容器种类繁多,它们都具有不同的性能,资源和利用率特性。
List不是查找的最快容器。字典或Hashset可能更好。但这取决于你需要如何使用它。
如果需要通过键查找顶点,则使用字典。如果顶点本身就是键,那么也可以使用哈希表。然后,您不需要索引的单独哈希表。
你真的需要点数吗?如果没有,那么只需对顶点使用哈希表,如果需要计数,则使用带有计数的顶点键入的字典。 Dictionary<Vertex3,int>