2015-11-28 50 views
0

在我的應用程序中,我有一個SortedDictionary。大多數情況下,Im在其中插入單個值 - 在這種情況下,我明白,它需要使用Compare方法來確定新值應添加到何處。 我只是想知道,是否有一些方法可以讓我初始化這個SortedDictionary讓我們說一個KeyValuePair<>[]數組,而不會導致Compare方法運行。初始化SortedDictionary而不進行比較

事情是,有時我確實有一個KeyValuePair<>[]數組,它包含已排序的鍵,因此它可以在沒有任何額外排序的情況下在SortedDictionary中轉換。我知道編譯器不知道我的集合是排序的,但既然我確定它,有什麼方法有意逃避比較?如果這個要求完全是廢話,你能解釋一下爲什麼?

我想要這個的唯一原因是因爲性能 - 使用大集合時,比較方法需要一些時間才能完成。

回答

1

[...]據我所知,編譯器完全不認識,我收集 排序,[...]

排序是不是編譯時間,但運行時的細節。

我不認爲這是一個好主意。這裏的原因了很好的總結,以不這樣做

  • 字典實際上是哈希表。因此,密鑰本身不排序本身
  • 排序字典要求比較器以任意順序提供密鑰。如果你不使用比較器,簡單的哈希表將能夠按照某種順序公開其密鑰?

在一天結束的時候,當你需要一個集合,其中它的順序是的插入順序,你應該使用一個List<T>,並在你的情況,你應該考慮List<KeyValuePair<TKey, TValue>>。無論如何,這不適用於你的情況。您希望提供已排序的序列作爲已排序字典的源,並且在構建時間後添加新對時填充字典時讓比較器工作。

我想說,如果你需要一個有序的字典,它依賴於在施工期間給出的一系列對,並且不能重新排序(因爲它們已經排序),那麼你需要想想滾動你自己的IDictionary<TKey, TValue>實現提供這樣的功能...

+0

謝謝你的回答。我將嘗試使用我自己的IDictionary實現。 – JakubJ

+0

@JakubJ沒問題,我想你在那裏做了一些努力,使用'Dictionary '作爲底層存儲,並且'SortedSet '作爲排序數據結構 –