2015-05-22 36 views
2

我正在使用SortedDictionary<Key, Value>來存儲排序的列表Key s,但不關心存儲Value s。 Key有一套唯一標準,另一套用於分類(即GetHashValue()Equals(Object obj)使用的屬性與CompareTo(Key key)使用的屬性不同)。當你不關心數值時,是否有使用C#的SortedDictionary <Key, Value>的常用風格?

我知道它只存儲對Value的引用,所以內存使用量很小。在我的使用案例中,我永遠不需要訪問存儲在字典中的KeyValuePair<Key, Value>Value部分。

是否有一些約定在這些情況下指定使用哪種對象Value?我目前對KeyValue使用同一個對象,即類型爲Dictionary<Key, Key>,我使用的是.Add(key, key)來添加對象。

同樣的問題適用於SortedList<Key, Value>,但在這種情況下我需要插入性能SortedDictionary<Key, Value>

回答

3

如果Value是一個引用類型,根據進程是32位還是64位,存儲它將浪費4到8個字節。如果Value是值類型,它可能會浪費更多。

如果您不需要它,您可以將Value設置爲Byte。即使空結構也不能低於1個字節。你可以設置任何值,大概0是一個不錯的選擇。

理想情況下,如果你需要的只是一套,你應該使用一套。

.NET 4.0+中有一個SortedSet<T>,它在內部使用樹。實際上,內部使用SortedSet<KeyValuePair<TKey, TValue>>

我猜,SortedList<TKey, TValue>的設置對應是List<T>。您只需使用二進制搜索並將值插入排序的位置。實施ISet<T>應該很簡單。

+0

太棒了。我在Java中更流利,所以我不太瞭解C#中可用的集合。在Oracle文檔中,當您查看Collection (http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html)的文檔時,可以找到「所有已知實現類」。微軟的C#文檔中有類似的東西嗎?我只是剛纔看到SortedSet 幾乎沒有提到Sorted Collection Types的底部(https://msdn.microsoft.com/en-us/library/5z658b67.aspx) – austinian

+2

@austinian標準通用集合的列表非常短: https://msdn.microsoft.com/library/system.collections.generic.aspx或者如果你想要完整列表,請從這裏開始:https://msdn.microsoft.com/library/gg145035.aspx(專業收藏很少使用,「對象模型集合」是一個基礎,一個可觀察的和幾個只讀的,這使得併發和通用)。 NuGet上也有不可變的集合。這就是它。 – Athari

相關問題