2009-08-05 9 views
15

私はいくつかのサンプルコードを調べていましたが、小さなデータ(約5-10オブジェクト程度ですが、この数は時間とともに変化する可能性があります)を格納するのにListDictionaryオブジェクトを使用しました。私がこのクラスを使って唯一の問題は、私がやっていることとは違って、一般的ではないということです。これは、私がここに間違っているなら、私がここでオブジェクトを取得するか、それを列挙してキャスティングが進行しているたびにそれを修正することを意味します。 Dictionary<T>オブジェクトのオーバーヘッドが十分であるため、非汎用のオーバーヘッドを正当化することはできませんListDictionaryListDictionaryクラスの一般的な代替方法はありますか?

このオブジェクトを使用するコードは、ページロードごとに列挙されます。これは、ListDictionaryクラスが他の代替方法の1つに使用された理由です。これはまた、私がこのデータのリストから最大のパフォーマンスを望む理由です。

+0

これについての結論に達し、パフォーマンス測定を行いましたか?コレクションの中にいくつかのアイテムしか存在しないときには常に 'Dictionary 'を使って気になってしまいますが、そこにいるという利便性は、何かを選択したり書き込んだりすることに伴う煩わしさやリスクを上回っています。それがない限り、パフォーマンスには大きな違いはありません。 – Rory

答えて

10

残念ながら、ListDictionaryに相当するものはありません。

ただし、実装するのは非常に難しいことではありません。 ListDictionaryは基本的に、Key/Valueペアのリンクリストを保持し、ルックアップ操作のために繰り返します。 LinkedList<T>を非常に単純なLINQ式でラップすることで、ListDictionary<TKey,TValue>を構築できます。例えば

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

+0

@Chuuしかし、ListDictionaryは値にアクセスする際に各キーでEqualsを呼び出すので、なぜLINQのどこにパフォーマンスが悪影響を与えるのですか? – sluki

+1

@sluki forループを含む単一のメソッドに対して、オブジェクトの割り当てと呼び出しを委譲します。 LINQは読みやすさのためであり、フレームワークコードのためのものではありません。 – jnm2

4

ListDictionaryに格納するデータが値型ではなく常にオブジェクト(クラス)である場合は、おそらくDictionary <T>より高速です。値の型(struct、int、doubleなど)を格納する場合、boxing/unboxingのコストは最もバランスのとれたものになります。代わりにDictionary <T>をお勧めします。

しかし、全体的には、これらの2つのパフォーマンスの差は、全体的なパフォーマンスの問題の中で最も少ないと指摘します。このような小さなことは、パフォーマンスの最適化に関しては、一般的に心配する最後のものです。 ListDictionaryとDictionary <T>の小さなパフォーマンスの違いが懸念される前に、プロセス間コール、データベースとWebサービスの対話など、より大きな規模のものがまず処理されるべきです。

+0

私は、パフォーマンスに関して心配するより大きなことがあることに完全に同意します。これを尋ねる理由は、私が今見てきたものであり、今プロジェクトに追加しているからです。ですから、もし私がListDictionaryクラスのよりよい代替を使うことができれば、それをそのままにするよりも良いと思います。 –

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によって支配されていない場合

、あなたは、その名前にもかかわらず、IDictionary<TKey, TValue>を実装SortedList<TKey, TValue>考えるかもしれません。単一リンクリストによってサポートされているListDictionaryとは異なり、SortedListはソートされたキーの配列と配列の値によってバックアップされます。

+0

これはこれまでのところ最良の答えだと思います。 –

関連する問題