2009-04-16 7 views
2

私がしようとしているのは、プロジェクトワイズな静的な辞書を持っているので、私のコードのどこからでも単一のリストにアクセスできます。共通の静的リストとしてのStringDictionary?

今まで、私はこのソリューション、パブリックプロパティとパブリック静的クラスを思い付いた:私はこの方法で使用

public static class Common 
{ 
    public static StringDictionary Domains 
    { 
     get 
     { 
      StringDictionary list = new StringDictionary(); 

      list.Add("212", "Location A"); 
      list.Add("555", "Location B"); 
      list.Add("747", "Location C"); 
      list.Add("000", "Location D"); 

      return list; 
     } 
    } 
} 

(私はGridViewのセルの内容を置き換えるためにそれを使用します):これは、効率的なソリューションである場合

if (Common.Domains.ContainsKey(e.Row.Cells[5].Text)) 
{ 
    e.Row.Cells[5].Text = Common.Domains[e.Row.Cells[5].Text]; 
} 
else 
{ 
    e.Row.Cells[5].Text = "n/a"; 
} 

しかし、私は知らない、および/またはこれを行うには、他の(良い)方法がある場合は...誰かがヒントを与えることはできますか?

ありがとうございます、アンドレア。

+0

編集:Dictionary 対StringDictionary、およびDictionary についてのディスカッションを見つけました(質問には関係ありません)。 – Albireo

答えて

3

おそらく、プロパティにアクセスするたびにリストを再作成する必要はありません。コンストラクタを静的コンストラクタに移動します。

public static class Common 
{ 
    private static StringDictionary _domains; 
    static Common() 
    { 
     _domains = new StringDictionary(); 
     _domains.Add("212", "Location A"); 
     _domains.Add("555", "Location B"); 
     _domains.Add("747", "Location C"); 
     _domains.Add("000", "Location D"); 
    } 
    public static StringDictionary Domains 
    { 
     get 
     { 
      return _domains; 
     } 
    } 
} 

返されるディクショナリは読み取り専用ではありません。したがって、このクラスのクライアントは、コレクションを変更することができます(たとえば、いくつかのエントリの追加/削除)。

+0

あなたは例を書いて私を打ちました.. –

+0

あなたの返信のおかげで、マーティン、それは私が探していたものです! – Albireo

+0

また、静的フィールドを介してコレクションを共有することに関連するすべてのスレッド問題を考慮する必要があります。これは非常に扱いにくい領域であり、私は答えでそれを詳しく説明しました。 –

0

あなたの辞書には、あなたがDomains

上のメモリにlistインスタンス辞書の読み込み専用の静的なコピーをロードして隠します静的コンストラクタを設定するのですかたびに再ロードされようとしています。

0

が代わりにSingletonパターンを使用することを検討してください:

http://en.wikipedia.org/wiki/Singleton_pattern

すべてのプログラムは、独自の特別なニーズを持っているので、それは必須ではありません、私はあなたがこのパターンについて読んで、もう一度あなたのデザインについて再考recommand。

プログラムがマルチスレッドの場合、StringDictionaryがスレッドセーフであるかどうかを確認したい場合は、スレッドセーフでない場合(プログラムがマルチスレッドの場合)、クラスに同期メカニズムを追加する必要があります。

+0

Martinも良い点を投稿しました。 – user88637

0

@Jeff Fritzは彼の答えでは正しいですが、私はちょうど複数のスレッド間でこのフィールドの共有アクセスについてもう少し詳しく述べたかっただけです。 StringDictionaryは、読み取り操作のためのスレッドセーフであり、書き込み操作ではないため、適切なロックなしでこのコレクションを変更しないように注意する必要があります。また、反復処理時にコレクションをロックする必要があります。

は反復処理するには、次の

lock(Common.Domains) { 
    foreach(var domain in Common.Domains) { 
    } 
} 

がドメインを追加するには静的コンストラクタ:一般的に

lock(Common.Domains) { 
    Common.Domains.Add("111", "Location 3"); 
} 

、経由して非読み取り専用のコレクションを共有するとき、私は非常に慎重になるだろうフィールドが変更されないようにします。代わりに StringDictionary ReadOnlyCollection作り、「読み取り専用」フィールドをマークすることもできます。

public static readonly ReadOnlyCollection<Pair<string, string>> domains 

あなたはO(1)ルックアップを取得することはできませんが、私はこのコレクションは非常に小さくなりますと仮定していますとにかくそれは問題ではありません。

関連する問題