web-dev-qa-db-ja.com

プロパティとしての.NET辞書

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

これまでに見た例では、すべての側面をカバーしていません。つまり、ディクショナリをプロパティとして宣言し、ディクショナリから要素を追加、削除、および取得する方法を説明していません。

26
Anand Shah

ここに簡単な例があります

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";
38
JaredPar

サンプルコード:

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]);
16
Hans Kesting

indexers を調べることもできます。 (MSDNの公式ドキュメント ここ

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"];

[〜#〜]編集[〜#〜]

MyClassはディクショナリではないため、ラッパークラスに実装しない限り、ディクショナリメソッドを使用できないため、これは慎重に使用する必要があります。しかし、インデクサーは特定の状況で優れたツールです。

12
DevinB

カプセル化が正しく、辞書をクラス外でAddまたはフォーム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;
4
user3202856

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}
    }          

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

2
Erik K.

例...

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);
    }
}
1
user110714

。net 4.6以降、次のように辞書を定義することもできます。

private Dictionary<string,int> Values => new Dictionary<string, int>()
{
    { "Value_1", 1},
    { "Value_2", 2},
    { "Value_3", 3},
};

それは Expression-bodied members と呼ばれます!

0
leon22

あなたはプロパティバッグのような意味ですか?

http://www.codeproject.com/KB/recipes/propertybag.aspx

0
Radu094