2009-08-05 107 views
15

我在看一些示例代碼,並在其中使用ListDictionary對象來存儲少量數據(大約5-10個對象左右,但這個數字可能會隨時間而改變)。我使用這個類的唯一問題是,與我一直在做的其他事情不同,它不是通用的。這意味着,如果我在這裏錯了,糾正我,每當我從這裏得到一個對象或列舉它正在進行投射。在較大的Dictionary<T>對象中是否有足夠的開銷來證明非泛型ListDictionary的開銷?有沒有ListDictionary類的通用替代方法?

將使用此對象的代碼將在每個頁面加載枚舉,我猜爲什麼ListDictionary類被用於其他替代方案之一。這也是我希望從這個數據列表中獲得最高性能的原因。

+0

您是否就此得出結論並進行任何績效評估?它總是困擾着我使用「Dictionary 」,當這個集合中只有少數項目時,它的便利性總是勝過選擇或者寫其他東西時的麻煩/風險。在性能方面不是什麼大問題......除非是這樣。 – Rory 2016-05-30 10:22:59

回答

10

不幸的是,沒有類似於ListDictionary的泛型。

但是,實施一個應該不是非常困難。本質上來說,ListDictionary通過保留一個Key/Value對的鏈表並對它們進行遍歷來進行查找操作。您可以構建一個ListDictionary<TKey,TValue>,通過使用一些非常簡單的LINQ表達式來包裝LinkedList<T>

例如

public class LinkedDictionary<TKey,TValue> { 
    private LinkedList<KeyValuePair<TKey,TValue>> _list = new LinkedList<KeyValuePair<TKey,TValue>>(); 
    private IEqualityComparer<TKey> _comp = EqualityComparer<TKey>.Default; 

    public void Add(TKey key, TValue value) { 
    _list.Add(new KeyValuePair<TKey,TValue>(key,value)); 
    } 
    public TValue Get(TKey key) { 
    return _list.Where(x => _comp.Equals(x.Key,key)).First().Value; 
    } 
    ... 
} 
+4

我會想象使用LINQ會否定使用ListDictionary的幾乎所有性能好處,除非計算哈希代碼是非常昂貴的。 – Chuu 2012-03-26 21:26:02

+0

@Chuu但是,當訪問值時,ListDictionary已經在每個鍵上調用Equals,所以爲什麼要提供LINQ的Where對性能有什麼負面影響? – sluki 2014-09-01 08:08:56

+1

@sluki對象分配和委託調用與包含for循環的單個方法相比較。 LINQ是爲了可讀性,而不是框架代碼。 – jnm2 2015-04-17 15:53:24

4

如果您在ListDictionary中存儲的數據始終是對象(類)而不是值類型,那麼它可能會比字典<T>更快。如果您將存儲值類型(結構,int,double等),那麼裝箱/拆箱的成本很可能會平衡一些事情,並且我會推薦使用字典<T>。

然而,總的來說,我會指出這兩者之間的性能差異可能是整體性能問題中最小的。像這樣的小事通常是性能優化時最擔心的事情。在關注ListDictionary和Dictionary <T>之間的微小性能差異之前,應先解決更大規模的問題,如進程間調用,數據庫和Web服務交互等。

+0

我完全同意在性能方面有更大的事情需要擔心。之所以這麼問,是因爲我現在正在關注這個問題,現在又加入了這個項目。所以如果我可以使用ListDictionary類的更好的替代方案,那麼我認爲這比以前保持的更好。 – 2009-08-05 18:51:19

1

MSDN-ListDictionary類的簡單檢查表明

這是使用單鏈接列表 一個簡單的實現 的IDictionary的。如果元素的數量是 10或更少,它將小於並且快於 散列表。如果 的性能對於大數目的元素很重要,則不應使用此值。

1

我們可以使用,

System.Collections.Generic.Dictionary<Object,Object> dictTemp = new System.Collections.Generic.Dictionary<Object,Object>(); 

例如,請考慮下面

using System.Collections.Specialized; 

    private ListDictionary g_Attributes = new ListDictionary(); 
    public ListDictionary Attributes 
    { 
     get { return this.g_Attributes; } 
    } 
    public string GetAttribute(string name) 
    { 
     if (HasAttribute(name)) 
      return (string) g_Attributes[name]; 
     else 
      return null; 
    } 
    public bool HasAttribute(string name) 
    { 
     return this.Attributes.Contains(name); 
    } 


    using System.Collection.Generic; 

    private Dictionary<string, object> g_Attributes = new Dictionary<string, object>(); 
    public Dictionary<string, object> Attributes 
    { 
     get { return this.g_Attributes; } 
    } 
    public string GetAttribute(string name) 
    { 
     if (HasAttribute(name)) 
     { 
      return g_Attributes[name].ToString(); 
     } 
     else 
     { 
      return null; 
     } 
    } 
    public bool HasAttribute(string name) 
    { 
    return this.Attributes.ContainsKey(name); 
    } 

我認爲這將有助於你一點!

1

沒有通用的等效ListDictionary

如果您對本小字典的使用不受AddRemove爲主,可以考慮SortedList<TKey, TValue>它,儘管它的名字,實現IDictionary<TKey, TValue>。與由單向鏈表支持的ListDictionary不同,SortedList由排序的鍵和數組值支持。

+0

我認爲這是迄今爲止最好的答案。 – 2018-01-10 12:10:33

相關問題