更快的替代品.Distinct()
我正在制作一款性能至关重要的video游戏。
我正在使用.Distinct()扩展方法从List获取唯一值。 有更快的方法吗? (即使它意味着有更多的代码行)
.Distinct
是O(n)
电话。
你不能比这更快。
但是,您应该确保GetHashCode
(以及在较小程度上, Equals
)尽可能快。
根据您的场景,您可以使用HashSet
替换List
HashSet
,这将防止首先插入重复项。 (还有O(1)
插入)
但是, 在得出需要更快的结论之前 ,请始终对代码进行概要分析 。
它必须是一个列表吗?
是否可以从List切换到HashSet? HashSet可以防止对象首先插入到列表中多次,因此Distinct已经完成。
如果您可以在不同的位置执行,您可以通过首先使用Array.Sort
然后执行以下操作:零分配
TSource oldV = source[0]; int pos = 1; for (int i = 1; i < source.Count; i++) { var newV = source[i]; source[pos] = newV; if (!eqComparer.Equals(newV, oldV)) { pos++; } oldV = newV; } //pos now == the new size of the array
然后,您必须跟踪现在较小的数组大小,或使用Array.resize(但这将分配一个新数组)
或者,如果您使用List
执行相同的方法,则可以在末尾调用RemoveRange
以在不分配的情况下调整其大小。 这最终会明显加快。
其他海报可能是正确的,但您可以通过其他方式实现此目标,例如首先使用哈希集,或保持并行集合,其中一直只包含不同的元素。 在插入/移除时抵消小成本,因此根本不需要时间来获得不同的集合。