2009-06-11 7 views
21

C#コードの例を紹介したり、クラスのプロパティとしてディクショナリが使用されているコードを提供したりすることはできますか。プロパティとしての.NETディクショナリ

これまで見た例では、ディクショナリをプロパティとして宣言し、辞書に要素を追加、削除、取得する方法をすべてカバーしていません。

答えて

32

は、ここでは簡単な例

class Example { 
    private Dictionary<int,string> _map; 
    public Dictionary<int,string> Map { get { return _map; } } 
    public Example() { _map = new Dictionary<int,string>(); } 
} 

いくつかのユースケースだ

var e = new Example(); 
e.Map[42] = "The Answer"; 
+0

うん "42"は "生命、宇宙、そしてすべての究極の質問への回答"です。 – Equiman

16

サンプルコード:

public class MyClass 
{ 
    public MyClass() 
    { 
    TheDictionary = new Dictionary<int, string>(); 
    } 

    // private setter so no-one can change the dictionary itself 
    // so create it in the constructor 
    public IDictionary<int, string> TheDictionary { get; private set; } 
} 

使用例:

MyClass mc = new MyClass(); 

mc.TheDictionary.Add(1, "one"); 
mc.TheDictionary.Add(2, "two"); 
mc.TheDictionary.Add(3, "three"); 

Console.WriteLine(mc.TheDictionary[2]); 
+4

私はIDictionaryをではなく、クラス全体としての性質をさらす検討します。 –

+0

ok、プロパティを変更しました –

1

例...

public class Example 
{ 
    public Dictionary<Int32, String> DictionaryProperty 
    { 
     get; set; 
    } 

    public Example() 
    { 
     DictionaryProperty = new Dictionary<int, string>(); 
    } 
} 

public class MainForm 
{ 
    public MainForm() 
    { 
     Example e = new Example(); 

     e.DictionaryProperty.Add(1, "Hello"); 
     e.DictionaryProperty.Remove(1); 
    } 
} 
10

またindexersに見ることができます。 (公式のMSDNドキュメントhere

class MyClass 
{ 
    private Dictionary<string, string> data = new Dictionary<string, string>(); 

    public MyClass() 
    { 
     data.Add("Turing, Alan", "Alan Mathison Turing, OBE, FRS (pronounced /ˈtjʊ(ə)rɪŋ/) (23 June, 1912 – 7 June, 1954) was a British mathematician, logician, cryptanalyst and computer scientist.") 
     //Courtesy of [Wikipedia][3]. Used without permission 
    } 

    public string this [string index] 
    { 
     get 
     { 
      return data[index]; 
     } 
    } 
} 

あなたが内部的に辞書を埋めた後次に、あなたが

MyClass myExample = new MyClass(); 

string turingBio = myExample["Turing, Alan"]; 

EDIT明らか

を行くことによって、それは情報のアクセスができ、これがなければなりませんMyClassは辞書ではないため、ラッパークラス用に辞書メソッドを実装しない限り、辞書メソッドは使用できません。しかし、インデクサーは特定の状況では素晴らしいツールです。

2

のみgetアクセサーを持つ静的プロパティとして辞書を使用してのもう一つの例:

private static Dictionary <string, string> dict = new Dictionary <string,string>(){    
      {"Design Matrix", "Design Case"}, 
      {"N/A", "Other"} 
    }; 


    public static Dictionary <string, string> Dict 
    { 
     get { return dict} 
    }   

この構造体は、値を置き換えるために使用することができます。

4

カプセル化が正しいこと、およびAddまたはForm ExampleDictionary [1] = "test"を使用して辞書をクラス外で更新できないようにするには、IReadOnlyDictionaryを使用します。

public class Example 
{ 
    private Dictionary<int, string> exampleDictionary; 

    public Example() 
    { 
     exampleDictionary = new Dictionary<int, string>(); 
    } 

    public IReadOnlyDictionary<int, string> ExampleDictionary 
    { 
     get { return (IReadOnlyDictionary<int, string>)exampleDictionary; } 
    } 
} 

次のコードは、IDictionaryのが使用されている場合はそうではありませんこれは、動作しません。

var example = new Example(); 
example.ExampleDictionary[1] = test; 
+0

私はOP(種類)を知っているので、彼はIDictionaryの機能を持つことをプロパティに要求しましたが、私はIReadOnlyDictionaryを認識せず、必要としていました。+1 –

+0

ディクショナリのコンテンツの変更を本当に防止したい場合、 'IReadOnlyDictionary'への単純なキャストは十分ではありません。 DictionaryをReadOnlyDictionaryにラップし、ラッパーを返す必要があります。 – marapet

関連する問題