2012-07-30 170 views
0

我想讓我的頭繞過SortedList和SortedDictionary等C#排序集合。我有兩個主要的精神障礙者,我找不到任何可以清楚解釋他們的地方。我知道這些集合保留自己的默認排序方式,您也可以指定它。排序的集合

我想我的問題很簡單;這是如何完成的?我找不到如何寫這些東西的簡單例子。

舉例來說,我想要一個集合來存儲從float到int的鍵值對,我希望能夠通過查詢集合來獲取最低浮點值。換句話說,我想用最小的關聯浮點鍵獲得int。我是否正確地認爲集合被排序的事實使得這種事情更有效率?這是否也意味着我可以抓住集合中的第一個元素,如:collection [0]?這將是最低的? (如果我這樣排序)

對不起,這個問題不是更簡潔,我只是不知道從哪裏開始。

+0

閱讀此:http://stackoverflow.com/questions/935621/whats-the-difference-between-sortedlist-and-sorteddictionary/935631#935631。至於示例:請查看MSDN:http://msdn.microsoft.com/en-us/library/ms132319.aspx – RBZ 2012-07-30 22:01:40

回答

0

在樹木和堆等數據結構上進行閱讀,以紅黑樹開頭。我想這就是一個典型的例子。谷歌和維基百科幫助。

基本上你插入的東西有某種定義,允許它比較大,相等,小於。插入時,元素進行比較和排序。所以當你搜索第一個或最後一個時,你知道他們是最小或最大的。例如,您也可以高效地檢查結構中是否有等於4的整數。

+0

謝謝,你能提供一個你如何設置它的例子嗎?我理解我只是不知道語法的理論。 – SirYakalot 2012-07-30 22:00:56

+0

嗯我不知道你在得到什麼,但在排序列表文檔中,它給你選擇將IComparer接口作爲參數傳遞到創建的列表。或者您可以確保元素實現一個IComparable來定義排序。 – 2012-07-30 22:04:21

+0

當然,但是語法是什麼?喜歡,你怎麼寫它?就像一個例子。 – SirYakalot 2012-07-30 22:15:50

1

SortedDictionary不會給你一個整數索引器和一個「get minimum key」函數; SortedList的確如此。但是,如果您按順序插入數據,SortedList效率極低。你應該先訂購,然後建立清單。

如果SortedDictionary中缺少的唯一函數是「get minimum key」,那麼可以使用FirstFirstOrDefault linq方法,因爲枚舉器按鍵順序返回鍵值對。如果您需要其他類似的函數(比如「get maximum key」),並且您還需要更高效地插入和刪除隨機分佈的值,那麼您應該自己實現一個二進制樹(SortedDictionary是),它會公開這些函數。

要實現IComparer<T>,創建一個新的類:

public class FloatComparer : IComparer<float> 
{ 
    public int Compare(float a, float b) 
    { 
     //your logic goes here; return -1 if a should be considered smaller or 1 if b should be considered smaller 
    } 
} 

然後將它傳遞到有序集合以通常的方式構造:

var collection = new SortedDictionary<float>(new IComparer<float>()); 
+0

那麼集合會自動從低到高排序? – SirYakalot 2012-07-30 22:19:58

+0

@SirYakalot如果您沒有提供自己的'IComparer '實例,集合將使用默認比較器,該比較器從低到高排序。因此,默認情況下,收藏集從低到高排序;換句話說,是的,除非另有說明,它們會自動從低到高排序。 – phoog 2012-07-30 22:23:35

+0

啊!我想我明白了!謝謝!有時候這些事情起初很混亂。好吧,無論如何。 – SirYakalot 2012-07-30 22:25:27

0

SortedDictionary是一個平衡樹,而SortedList只是一個連續的內存塊,恰好包含有序元素。在這兩種情況下,我們需要定義什麼是「小於」的意思,所以樹可以組織其節點和排序列表可以訂購它的元素:

  • 如果您傳遞實現IComparer到這些構造一個對象容器,這是什麼被使用。只要它是一個嚴格的弱排序,它就可以正常工作。例如,通過提供一個「大於」比較器,可以很容易地對容器進行分類。
  • 否則,使用default comparer

在你的情況下(其中float是關鍵),默認比較器將做正確的事情,並從最低值到最高值排列元素。獲得第一個元素將是有效的,並且第一個元素也恰好是最低值。