【发布时间】:2014-03-31 04:28:45
【问题描述】:
我将顶点保存在一个列表中,我只想将一个顶点添加到列表中,如果它还没有包含它。如果它不包含它,我会将它添加到列表中,然后将索引添加到名为 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]);
}
}
【问题讨论】:
-
我读到使用带有索引的
for比foreach快。除此之外,您可以使用Dictionary<Vector3>,这使得找到顶点 O(1)。 -
@ThorstenDittmar - Hashtable 也有 O(1),只是它不像 Dictionary 那样通用,所以你要为装箱/拆箱付费。此外,哈希表(或字典)的容量应大于实际填充 - 根据我的个人经验,1/3 比例是最好的。
-
我同意@ThorstenDittmar,但我会选择
HashSet<Vector3>而不是字典 -
@SpookKruger 我首先尝试了 HashSet
,唯一的问题是我无法从中获取索引,因此无法将索引放入 tri 列表中
标签: c# performance list indexing