web-dev-qa-db-ja.com

辞書のゲッターとセッターを書く方法は?

辞書などの複雑なデータ型のゲッターとセッターをどのように定義しますか?

public Dictionary<string, string> Users
{
    get
    {
        return m_Users;
    }

    set
    {
        m_Users = value;
    }
}

これは辞書全体を返しますか?特定のキーと値のペアが存在するかどうかを調べて確認するセッターを作成し、存在しない場合は追加しますか?それ以外の場合、現在のキーと値のペアを更新しますか? getの場合、辞書全体ではなく特定のキーと値のペアを返すことができますか?

21
Mausimo

プロパティのみを含む方法でそれを行うことはできません。 理論的にははセッターを作成できますが、ゲッターの場合は、取得するキーを指定する必要があります。プロパティはパラメーターを受け入れないため、これは不可能です。あなたが望むことを達成する自然な方法はメソッドを使うことでしょう:

private Dictionary<string, string> users = new Dictionary<string, string>();

public void Set(string key, string value)
{
    if (users.ContainsKey(key))
    {
        users[key] = value;
    }
    else
    {
        users.Add(key, value);
    }
}

public string Get(string key)
{
    string result = null;

    if (users.ContainsKey(key))
    {
        result = users[key];
    }

    return result;
}

あるいは、他の人がすでに言ったように、インデクサーを使用することもできますが、私は常にそれらが少し面倒であることを発見しました。しかし、それは個人の好みの問題だと思います。

そして、完全を期すために、これはセッターがどのように見えるかを示していますが、そのようなプロパティを持つことは非常に珍しく、直感に反しています。

public KeyValuePair<string, string> Users
{
    set
    {
        Set(value.Key, value.Value);
    }
}

内部的には、以前のスニペットのSetメソッドを使用しています。

18
Nikola Anusev

インデクサープロパティを使用する( [〜#〜] msdn [〜#〜] ):

public class YourClass
{
    private readonly IDictionary<string, string> _yourDictionary = new Dictionary<string, string>();

    public string this[string key]
    {
        // returns value if exists
        get { return _yourDictionary[key]; }

        // updates if exists, adds if doesn't exist
        set { _yourDictionary[key] = value; }
    }
}

次に、次のように使用します。

var test = new YourClass();
test["Item1"] = "Value1";
27

プロパティでそれを行うことはできません。そのためのメソッドを使用するか、クラスにインデクサーを追加する必要があります。 getメソッドはパラメーター(キー)を受け入れることができません。

別のオプションとして、誰かがキーをディクショナリに簡単に追加/削除できるようにしたいが、まったく新しいキーを設定できないようにする場合は、プロパティを読み取り専用プロパティにして、コンストラクターで作成されたディクショナリを返します。 get/setメソッドを追加するよりも柔軟性は低くなりますが、一般的には単純なケースで問題なく実行できます。

1
Servy

「名前付きインデクサー」が必要なようです。これが(my) one C#を使用して実現する方法です。

私のアプローチは、(デフォルトのインデクサーを使用して)オブジェクトを返すプロパティを公開します。これにより、ラムダを使用して適切なフィールドにインデックスを作成します。

この方法を使用したい場合と使用しない場合がありますが、それはあなたにお任せします。 :)

1
Ani
Dictionary<string, string> param = new Dictionary<string, string>();

public void SetYourParameter(string parametrName, string paramValue)
{
    param[parametrName] = paramValue;            
}

public string GetYourParameter(string parametrName)
{
    // ContainKey ---> It returns value if the key was found
    if( param.ContainsKey(parametrName))
        return param[parametrName];
    else
        return null;
}
0
NG5121472

isセッターを使用してこれを行うことは可能ですが、あまりお勧めできません。取得するものを決定するためのパラメーターを必要としないため、ゲッターでは完全に不可能です。

セッターの場合、単一のペアでDictionary<string, string>を渡す必要がありますが、これは、ゲッター/セッターが通常行うことを期待したものに反し、ディクショナリー全体の設定を完全に停止します。

はるかに良い方法は、必要に応じてGetおよびSetという名前を付けることができる2つのメソッドを使用することです。

0
Graham Wager