更快的替代品.Distinct()

我正在制作一款性能至关重要的video游戏。

我正在使用.Distinct()扩展方法从List获取唯一值。 有更快的方法吗? (即使它意味着有更多的代码行)

.DistinctO(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以在不分配的情况下调整其大小。 这最终会明显加快。

其他海报可能是正确的,但您可以通过其他方式实现此目标,例如首先使用哈希集,或保持并行集合,其中一直只包含不同的元素。 在插入/移除时抵消小成本,因此根本不需要时间来获得不同的集合。