2012-07-18 84 views
6

我想通過T的兩個屬性對容器中的類型T的數據進行排序。這可能是很多數據,所以我更願意在插入時進行排序。我查看了ListSortedList,但都不能完全提供我需要的功能。使用比較函數插入時排序

C#提供了一個容器,它允許在插入和排序我的比較函數時進行排序嗎?我想避免插入後排序,如List.Sort,並避免使用數據作爲SortedList的鍵和值的開銷。

+1

有一個'IComparer'接口可以幫助排序功能。每個元素都可以使用您的自定義比較器對象通過元素屬性的任意組合進行排序。可能需要爲自定義分揀容器實施IList 。 – IAbstract 2012-07-18 19:46:07

+0

這似乎比數據結構問題更具算法性。當所有數據都插入到列表中時,是否有定義的端點?當更多的數據被插入時,你需要數據嗎?你需要在這個列表中有多個相同的值嗎?你稱之爲「大量數據」是什麼? – 2012-07-18 20:03:22

+0

看看這篇文章...大概它會回答你的問題:http://devlicio.us/blogs/marcin_hoppe/archive/2007/05/15/how-to-keep-list-t-sorted。 aspx – 2012-07-18 19:57:07

回答

6

如果您使用的是.NET 4,則可以使用SortedSet以及自定義的IComparer<T>。缺點是它不允許你有多個相同的元素。你需要嗎?

我不清楚爲什麼你想插入排序只是因爲你有大量的數據。在完成插入之前是否需要對它進行排序?如果不是的話,我希望在最後一次排序(通過List.Sort)和現成的排序一樣高效。

+0

我聽到你說這聽起來像是一個XY問題,@JonSkeet? – 2012-07-18 19:48:37

+0

好吧。我不會那麼做,但至少值得進一步考慮。 – 2012-07-18 19:50:01

2

如果您想始終保持相同的排序順序,您可以使用SortedList<K,V>SortedDictionary<K,V>並將IComparer<K>傳遞給構造函數。

如果在同一個容器上需要不同的排序順序,則可以使用List<T>並將IComparer<T>傳遞給Sort方法。

由於您可能正在存儲引用類型,因此我不會過多擔心將項目用作關鍵字和值。你只是存儲引用。

另一種選擇是實現你自己的二叉樹結構。

+0

用給定的信息,你的答案應該可以解決問題。 – 2012-07-18 20:16:05