7
A
回答
19
.Distinct
是O(n)
調用。
你不能比這更快。
但是,您應該確保您的GetHashCode
(以及較小程度的Equals
)儘可能快。
根據您的情況,您可以用HashSet<T>
代替List<T>
,這樣可以防止首先插入重複項。 (還有O(1)
插入)
但是,始終在剖析你的代碼之前,跳到關於什麼需要更快的結論。
+4
+1對於「在跳到必須更快的結論之前總是剖析你的代碼」 –
4
是否必須是List?
是否可以從List切換到HashSet? HashSet首先防止對象被多次插入到列表中,所以Distinct已經完成。
0
如果你能做到的地方不同,你可以很迅速,零個分配首先使用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<T>
做同樣的方法,您可以調用RemoveRange
在最後調整大小而不分配。這最終顯着更快。
其他海報可能是正確的,但您可以通過其他方式實現此目標,例如首先使用哈希集合,或者保持平行集合,其中只包含不同元素。在插入/移除時抵消小額費用,以便根本不需要時間來獲得不同的組合。
相關問題
- 1. 這行代碼更聰明/更快/更聰明的替代品?
- 2. 更快捷/更有效的Ruby元帥替代品?
- 3. 替代memcpy更快?
- 4. 更快amfPHP替代
- 5. 更快的替代itertools.product
- 6. 更快的替代calcOpticalFlowSF
- 7. 更快的替代ColorConvertOp
- 8. PtrToStrAnsi更快的替代?
- 9. 父(),更快的替代?
- 10. 更快的替代webclient/webdrive
- 11. SELECT DISTINCT的替代方案
- 12. 是否有更快的ActiveRecord to_xml替代品?
- 13. R:A更快替代scaleBy
- 14. @「」的替代品?
- 15. ASIHTTP的最佳替代品,替代品或替代品用於下載隊列
- 16. MongoDB是Memcached的更好替代品嗎?
- 17. Photoshop和Gimp更簡單的替代品
- 18. Pieceable的替代品
- 19. NowJS的替代品
- 20. Flash的替代品?
- 21. RelativeLayout的替代品?
- 22. JMegahal的替代品
- 23. JodReports的替代品
- 24. Git的替代品?
- 25. YQL的替代品
- 26. window.scrollMaxY的替代品?
- 27. FMINCON的替代品
- 28. SuperSized的替代品
- 29. reCAPCTHA的替代品?
- 30. wx.lib.masked.NumCtrl的替代品
這將有助於有更多的背景... – soandos
你需要更多的細節 - 你有控制如何生成列表?你可以做得更好,如果你從來沒有在列表中插入重複的元素...... –
'.Distinct' _is_更快。你有個人簡介嗎? – SLaks